<?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>5557687681328</gr:continuation><updated>2026-08-17T10:58:43Z</updated><entry gr:crawl-timestamp-msec="1786950000000"><id gr:original-id="https://testingil.com/?p=9655">tag:google.com,2005:reader/item/0000025700000117</id><category term="AI Quality"></category><title type="html">AI vs CI: Nobody Told the Pipeline</title><published>2026-08-17T07:00:00Z</published><updated>2026-08-17T07:00:00Z</updated><link rel="alternate" href="https://testingil.com/2026/08/ai-vs-ci-repeatability.html" type="text/html"></link><summary type="html">&lt;p&gt;CI is so commonplace these days, we don’t often think about why it’s there. And that reasoning really matters these days, because of how we use it.&lt;/p&gt;



&lt;p&gt;Especially when you’re writing AI agents and expect the CI system to run a regression test suite, and sound the alarm when something goes wrong.&lt;/p&gt;



&lt;p&gt;Here’s a funny story you may not know. CI – Continuous Integration – was not originally a tool category. It’s a process – it’s how you continuously integrate pieces of code together.&lt;/p&gt;



&lt;p&gt;Anyway, why do you need this process anyway? Because you’re scared. You’re terrified that integration broke something.&lt;/p&gt;



&lt;p&gt;So what do you do? You look for approval. An automation system that runs all the tests all the time is our approval of choice.&lt;/p&gt;



&lt;p&gt;That’s how CI became a tool category. Because in its heart, it’s a simple automation pipeline.&lt;/p&gt;



&lt;p&gt;So, that automation’s holy grail is speed, right?&lt;/p&gt;



&lt;p&gt;Wrong.&lt;/p&gt;



&lt;h2&gt;The mission was to kill “Works on my machine”&lt;/h2&gt;



&lt;p&gt;Remember when we wrote software in a cave, and we had a sticker on our computers – “Works on my machine. Don’t run it on another cave”?&lt;/p&gt;



&lt;p&gt;Ah, the good old days.&lt;/p&gt;



&lt;p&gt;Because the CI automation #1 OG mission was to kill “Works on my machine”. How? By creating a repeatable process. Independent of all the weird installs on my machine. Multiple versions of libraries. And different configurations. And admin hacks.&lt;/p&gt;



&lt;p&gt;The CI builds, packages, runs and tests the software every time the same way. That way, if a test turns red, you know something bad happened, because it was green until now. And why your stomach turns, when it flakes between red and green – that’s the feeling of lost &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/2023/09/the-4-attributes-of-testability-reproducibility.html&quot;&gt;repeatability&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Yes, repeatability brings bliss. Well, it did, before AI.&lt;/p&gt;



&lt;h2&gt;Then AI showed up&lt;/h2&gt;



&lt;p&gt;If your app does not touch AI (although building with code agents, can sometimes count as “touch”), you’ll continue to feel that bliss.&lt;/p&gt;



&lt;p&gt;But if you’re developing AI-based features, or agents, or vibe-coding, you’re in for a new experience every time you push your code (or prompts) into CI.&lt;/p&gt;



&lt;p&gt;Things are not repeatable anymore. Models change, sometimes without warning. And always under your feet. And when a model changes, does it trigger a run?&lt;/p&gt;



&lt;p&gt;You wish! Your alert system is malfunctioning.&lt;/p&gt;



&lt;p&gt;And the worst part is not a regression. Although if it’s a bug in a prompt, you may not be able to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/2026/07/testing-ai-generated-code-prompt-not-a-fix.html&quot;&gt;fix it&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;No, the worst part is that Green today doesn’t tell you what kind of Green it is. Things are no longer Working or not, they are Work-ish. But even that’s not the same work-ish every day.&lt;/p&gt;



&lt;p&gt;So we’ve got fewer triggers, results we can’t read, and on top of it – every run means something else.&lt;/p&gt;



&lt;h2&gt;What’s the solution?&lt;/h2&gt;



&lt;p&gt;Repeatability gives us confidence. CI is the process, and tools, that give us the approval we seek, and the confidence we have comes from that repeatability.&lt;/p&gt;



&lt;p&gt;We can’t rely on the trigger anymore, but we can initiate our own runs. And since one run is not enough, we need to run more and look at the trends. Catch drift before it ships.&lt;/p&gt;



&lt;p&gt;What happens to quality when AI meets CI? We need to get back to the reasoning, and change how we manage quality.&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;I write about this stuff every week. What AI does to the things we built to keep quality steady, and what to do about it.&lt;/p&gt;



&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://testingil.com/contact/mailing-list-registration&quot;&gt;Subscribe here&lt;/a&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/08/ai-vs-ci-repeatability.html&quot;&gt;AI vs CI: Nobody Told the Pipeline&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="1786917878139"><id gr:original-id="tag:blogger.com,1999:blog-3868566217808655382.post-7009343743562552017">tag:google.com,2005:reader/item/000002c500000477</id><title type="html">Implementing Page Objects in Playwright</title><published>2026-08-16T22:04:38Z</published><updated>2026-08-16T22:04:38Z</updated><link rel="alternate" href="https://www.tjmaher.com/2026/08/implementing-page-objects-in-playwright.html" type="text/html"></link><summary type="html">&lt;div&gt;Picture a login screen, such as &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://the-internet.herokuapp.com/login&quot;&gt;The-Internet / Login&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&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/a/AVvXsEjdktRcEmjQSmhFeskjFOAzzFpAPjkfj00pfA87GhFl0-Ec95kc4fqhHAc-HJBfrBAZyzF6xVh9Hta_1fqQrX4hYNAA2eWTHyfsJoJit7LonMLT9Wnx5HzEUQEn8eVUjH--OOYW57Zu1S5bKYW4prvgRFgDMw-9SoKEGxesgcvgVtRy950efOCC7OipPCY&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;317&quot; data-original-height=&quot;383&quot; data-original-width=&quot;484&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjdktRcEmjQSmhFeskjFOAzzFpAPjkfj00pfA87GhFl0-Ec95kc4fqhHAc-HJBfrBAZyzF6xVh9Hta_1fqQrX4hYNAA2eWTHyfsJoJit7LonMLT9Wnx5HzEUQEn8eVUjH--OOYW57Zu1S5bKYW4prvgRFgDMw-9SoKEGxesgcvgVtRy950efOCC7OipPCY=w400-h317&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;On this LoginPage, there is:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;a heading: Login Page&lt;/li&gt;&lt;li&gt;a user name textbox with the label, &amp;quot;Username&amp;quot;&lt;/li&gt;&lt;li&gt;a password textbox with the label, &amp;quot;Password&amp;quot;&lt;/li&gt;&lt;li&gt;a login button, with the role of a button, and the name of &amp;quot;Login&amp;quot;&lt;/li&gt;&lt;li&gt;a flash message that appears if you enter invalid credentials such as &amp;quot;NotAUser&amp;quot; and &amp;quot;NotAPassword&amp;quot;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you successfully log in with &amp;quot;tomsmith&amp;quot; and &amp;quot;SuperSecretPassword!, there is a SecureArea:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;a heading: &amp;quot;Secure Area&amp;quot;&lt;/li&gt;&lt;li&gt;a flash message &amp;quot;You logged into a secure area!&amp;quot;&lt;/li&gt;&lt;li&gt;a Logout button. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Sure, you could interact with each web element in your test... but what if the username text box locator changes? You would have to update multiple tests every time the element changed. &lt;/div&gt;&lt;/div&gt;&lt;br&gt;... Instead, you could place it in a Page Object, something that &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/pom&quot;&gt;Playwright handles well&lt;/a&gt;! &lt;br&gt;&lt;br&gt;&amp;quot;A page object represents a part of your web application. An e-commerce web application might have a home page, a listings page and a checkout page. Each of them can be represented by page object models.&lt;br&gt;&lt;br&gt;&amp;quot;Page objects simplify authoring by creating a higher-level API which suits your application and simplify maintenance by capturing element selectors in one place and create reusable code to avoid repetition&amp;quot;.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Using Playwright&amp;apos;s Built-In Test Runner? Or Something Else?&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You may have noticed in &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/pom&quot;&gt;https://playwright.dev/docs/pom&lt;/a&gt; that there are two different styles of page objects. One for &amp;quot;Test&amp;quot;. One for &amp;quot;Library&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;Test&lt;/b&gt;: If you are writing actual Playwright test suites, and Playwright&amp;apos;s built in test runner, use the Test section as a guide when creating page objects. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Library&lt;/b&gt;: If you are integrating Playwright into an existing test framework such as Jest or Cucumber and just want browser automation, instead of having pre-built page fixtures, etc, you can use this format. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span&gt;&lt;a name=&quot;article-cWXMIz-fUT-jekXxGn7yymS2-VU-more&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Setting Up Page Objects&lt;/h2&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;
Let&amp;apos;s review a page object I created for the main login page on my GitLab account for the bun-create-typescript project, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/pages/LoginPage.ts&quot;&gt;tests/pages/LoginPage.ts&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The first thing we do is import the Locator method and Page fixture from the Playwright Test library.  &lt;/div&gt;&lt;div&gt;  
  
&lt;pre&gt;&lt;code&gt;import { type Locator, type Page } from &amp;quot;@playwright/test&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-fixtures&quot;&gt;Playwright.dev / Class-Fixtures&lt;/a&gt;, &amp;quot;Playwright Test is based on the concept of the &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-fixtures&quot;&gt;test fixtures&lt;/a&gt;. Test fixtures are used to establish environment for each test, giving the test everything it needs and nothing else.&lt;br&gt;&lt;br&gt;&amp;quot;Playwright Test looks at each test declaration, analyses the set of fixtures the test needs and prepares those fixtures specifically for the test. Values prepared by the fixtures are merged into a single object that is available to the test, hooks, annotations and other fixtures as a first parameter [...]&lt;br&gt;&lt;br&gt;&amp;quot;Playwright Test will set up the page fixture before running the test, and tear it down after the test has finished. page fixture provides a &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-page&quot;&gt;Page&lt;/a&gt; object that is available to the test&amp;quot;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;The Page and Locator Class&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-page&quot;&gt;Playwright.dev / Page&lt;/a&gt;, &amp;quot;Page provides methods to interact with a single tab in a &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-browser&quot;&gt;Browser&lt;/a&gt;, or an &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.chrome.com/extensions/background_pages&quot;&gt;extension background page&lt;/a&gt; in Chromium. One &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-browser&quot;&gt;Browser&lt;/a&gt; instance might have multiple &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-page&quot;&gt;Page&lt;/a&gt; instances.&amp;quot;. These pages are isolated from each other, created for each test. The page fixtures have their own setup and teardown methods, such as opening up a new browser before a test starts, and closing a browser when a test ends. &lt;/div&gt;&lt;br&gt;&lt;div&gt;According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators&quot;&gt;Playwright.dev / Locators&lt;/a&gt;, &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-locator&quot;&gt;Locator&lt;/a&gt;s are the central piece of Playwright&amp;apos;s auto-waiting and retry-ability. In a nutshell, locators represent a way to find element(s) on the page at any moment&amp;quot;. The built-in Playwright locators are: &lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-role&quot;&gt;page.getByRole()&lt;/a&gt; to locate by explicit and implicit accessibility attributes.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-text&quot;&gt;page.getByText()&lt;/a&gt; to locate by text content.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-label&quot;&gt;page.getByLabel()&lt;/a&gt; to locate a form control by associated label&amp;apos;s text.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-placeholder&quot;&gt;page.getByPlaceholder()&lt;/a&gt; to locate an input by placeholder.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-alt-text&quot;&gt;page.getByAltText()&lt;/a&gt; to locate an element, usually image, by its text alternative.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-title&quot;&gt;page.getByTitle()&lt;/a&gt; to locate an element by its title attribute.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/locators#locate-by-test-id&quot;&gt;page.getByTestId()&lt;/a&gt; to locate an element based on its data-testid attribute (other attributes can be configured).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Define the Page Object Class&lt;/h2&gt;&lt;div&gt;Now that we have imported the Page and Locator class from Playwright, we can define the LoginPage page object class.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;export class LoginPage {
  readonly page: Page;
  readonly usernameInput: Locator;
  readonly passwordInput: Locator;
  readonly loginButton: Locator;
  readonly alertMessage: Locator;
  readonly heading: Locator;
&lt;/code&gt;&lt;/pre&gt;
Here, we are declaring LoginPage as a Page class, and creating Locator objects that will find and point to the username and password textboxes, the login button, the alertMessage, and the heading. &lt;br&gt;  
&lt;br&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Initialize the Page Object Class&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Now that we have defined the page object, we can initialize a constructor for the page, setting up reusable locators for all the web elements we defined. &lt;br&gt;  
  
&lt;pre style=&quot;text-align: left&quot;&gt;&lt;code&gt;  constructor(page: Page) {
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://this.page&quot;&gt;this.page&lt;/a&gt; = page;
    this.usernameInput = page.getByLabel(&amp;quot;Username&amp;quot;);
    this.passwordInput = page.getByLabel(&amp;quot;Password&amp;quot;);
    this.loginButton = page.getByRole(&amp;quot;button&amp;quot;, { name: &amp;quot;Login&amp;quot; });
    this.alertMessage = page.locator(&amp;quot;#flash&amp;quot;);
    this.heading = page.getByRole(&amp;quot;heading&amp;quot;, { name: &amp;quot;Login Page&amp;quot; });
  }&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;The textboxes are labeled &amp;quot;Username&amp;quot; and &amp;quot;Password&amp;quot;. If we know that these labels are not expected to change, we can use the labels as a locator strategy. &lt;/li&gt;&lt;li&gt;The login button, we can use as a locator strategy its role &amp;quot;button&amp;quot; and the name &amp;quot;Login&amp;quot;.&lt;/li&gt;&lt;li&gt;The alert message is tricky. Here, we can grab the id, &amp;quot;#flash&amp;quot;, in the locator.&lt;/li&gt;&lt;li&gt;The heading, we can also get by role of &amp;quot;heading&amp;quot;, and name of &amp;quot;Login Page&amp;quot;. &lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Navigate to the Login Page&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s embed in this Login Page Object a way to navigate to the Login page. &lt;/div&gt;  
  
&lt;pre&gt;&lt;code&gt;  async navigate(): {
    await this.page.goto(&amp;quot;/login&amp;quot;);
  }
&lt;/code&gt;&lt;/pre&gt;
  
Here, we have defined a method in the LoginPage page object our tests can use. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In our &lt;b&gt;playwright.config.ts&lt;/b&gt; (see &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/playwright.config.ts&quot;&gt;code in GitLab&lt;/a&gt;) we have already declared our baseURL to be &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://the-internet.herokuapp.com&quot;&gt;https://the-internet.herokuapp.com&lt;/a&gt;, which will display when a new browser window is opened when a new test starts. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;When in our test we instantiate a new LoginPage method, and call the navigate method, it will goto &amp;quot;login&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;async&lt;/b&gt; has been placed before the function definition, since the browser will not be happening instantly. Actions will be happening asynchronously, all at the same time. It returns a &amp;quot;Promise&amp;quot; object.&lt;/li&gt;&lt;li&gt;&lt;b&gt;await&lt;/b&gt; can be used inside an aync function. It tells the program to pause execution until the slow action, such as loading a webpage is finished. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;What is a Promise?&lt;/u&gt;&lt;/b&gt; &amp;quot;A Promise is a proxy for a value not necessarily known when the promise is created. It allows you to associate handlers with an asynchronous action&amp;apos;s eventual success value or failure reason. This lets asynchronous methods return values like synchronous methods: instead of immediately returning the final value, the asynchronous method returns a promise to supply the value at some point in the future&amp;quot;. - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;&lt;i&gt;Developer.Mozilla.com / JavaScript / Promise&lt;/i&gt;&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;b&gt;&lt;u&gt;What is Asynchronous Programming in JavaScript&lt;/u&gt;?&lt;/b&gt; &amp;quot;JavaScript, especially when running in a web browser environment, has a unique challenge. It&amp;apos;s single-threaded, meaning it has one line of execution at a time. If any task (fetching data, responding to a button click, etc.) takes a long time, it would freeze the entire webpage!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;quot;Asynchronous programming is the pattern to tackle this. It enables us to start a potentially long-running operation and tell JavaScript, &amp;apos;Go about your business, I&amp;apos;ll let you know when this is ready.&amp;apos; This prevents the webpage from locking up. &lt;br&gt;&lt;br&gt;&amp;quot;[...] JavaScript async await lets us write asynchronous code that resembles the style of straightforward, step-by-step (synchronous) code. This often makes the logic much easier to follow.- &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.upgrad.com/tutorials/software-engineering/javascript-tutorial/javascript-async-await/&quot;&gt;&lt;i&gt;Upgrad.com / tutorials / JavaScript aync-await&lt;/i&gt;&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Creating a LoginAs Method&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Sure, we could fill in the username, fill in the password, and click the login button, but what if that login procedure changes? We would have to hunt down every time we logged into the app, and make the changes in the test. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;There is a software design principle called &lt;b&gt;DRY: Don&amp;apos;t Repeat Yourself&lt;/b&gt;, first coined by Andy Hunt and Dave Thomas in their book &amp;quot;The Pragmatic Programmer: From Journeyman to Master (1999)&amp;quot; (&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://en.wikipedia.org/wiki/The_Pragmatic_Programmer&quot;&gt;See Wikipedia&lt;/a&gt;, and the interview with both authors &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/taCNjiiusRk?si=RltNuFmX8FuigiCj&quot;&gt;on YouTube at GoTo Conference 2020&lt;/a&gt;). &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Instead, we could create a new async method called &amp;quot;loginAs&amp;quot; where we pass in the username and password. &lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;pre&gt;&lt;code&gt;  async loginAs(username: string, password: string): {
    await this.usernameInput.fill(username);
    await this.passwordInput.fill(password);
    await this.loginButton.click();
  }
&lt;/code&gt;&lt;/pre&gt;  
  
Both &amp;quot;fill&amp;quot; and &amp;quot;click&amp;quot; are Playwright actions ( &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/input&quot;&gt;See docs&lt;/a&gt; ). &lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;Text input can use &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-locator#locator-fill&quot;&gt;locator.fill&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Checkboxes and radio buttons can .check them off, then expect them .toBeChecked. &lt;/li&gt;&lt;li&gt;Multiple radio buttons can be .selectOptions by value or label. &lt;/li&gt;&lt;li&gt;Mouse clicks can be performed with a mouse click, a double mouse click, a right click, a shift click, or a control click. &lt;/li&gt;&lt;li&gt;You can press keys such as .press(&amp;apos;Enter&amp;apos;), or .press(&amp;apos;Control+ArrowRight&amp;apos;).&lt;/li&gt;&lt;li&gt;You can also press keys such as Backquote, Minus, Equal, Backslash, Backspace, Tab, Delete, Escape, ArrowDown, End, Enter, Home, Insert, PageDown, PageUp, ArrowRight, ArrowUp, F1 - F12, Digit0 - Digit9, KeyA - KeyZ, etc&lt;/li&gt;&lt;li&gt;You can .dragAndDrop, and explicitly .scrollIntoViewIfNeeded().&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;We have the locator, such as this.usernameInput, that we have declared, so now we can perform an action on the locator. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Get Text From Web Elements&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Need to get text from an element such as an alert message or a heading? Using a locator, you can retrieve the innerText property of the web element. According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText&quot;&gt;Mozilla Org / HTMLElement / innerText&lt;/a&gt;, &amp;quot;As a getter, it approximates the text the user would get if they highlighted the contents of the element with the cursor and then copied it to the clipboard&amp;quot;.&lt;/div&gt;  
&lt;pre&gt;&lt;code&gt;  async getAlertMessage() {
    return (await this.alertMessage.innerText()).trim();
  }
&lt;/code&gt;&lt;/pre&gt;
Once we get the text of the web element, there may be hidden whitespaces in the text. &amp;quot;The trim() method of &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String&quot;&gt;String&lt;/a&gt; values removes whitespace from both ends of this string and returns a new string, without modifying the original string&amp;quot;. - &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim&quot;&gt;Mozilla.Org / String / Trim&lt;/a&gt;&lt;br&gt;&lt;br&gt;  
&lt;pre&gt;&lt;code&gt;  async getHeading() {
    return (await this.heading.innerText()).trim();
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;After getting the text and trimming it, we return it to our test function. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We could have set up the page objects to expect the correct heading or alert message is correct, sending to the method what should be expected... but I try to avoid this whenever possible. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Personally, I prefer to keep the assertions, the things we are testing for, in the actual test and out of the page object. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Setting Up Test Data&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;Yes, with just one set of valid credentials, separating them into a JSON file is overkill... but what if there were hundreds of valid test users? Here we are placing them into a JSON (JavaScript Notation) file called credentials with two top level objects... valid, and invalid. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In them, we have two key-value pairs in each object, username and password. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;  

tests/ data/ credentials.json&lt;pre&gt;&lt;code&gt;{
  &amp;quot;valid&amp;quot;: {
    &amp;quot;username&amp;quot;: &amp;quot;tomsmith&amp;quot;,
    &amp;quot;password&amp;quot;: &amp;quot;SuperSecretPassword!&amp;quot;
  },
  &amp;quot;invalid&amp;quot;: {
    &amp;quot;username&amp;quot;: &amp;quot;NotAUser&amp;quot;,
    &amp;quot;password&amp;quot;: &amp;quot;NotAPassword&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;  
  
Need to add or change usernames and passwords? &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;No need to hunt through test data. Change just what is in the credentials file, and everything else will be reset. ( &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/data/credentials.json?ref_type=heads&quot;&gt;See this code in GitLab bun-create-playwright.&lt;/a&gt; )&lt;br&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;&lt;br&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Setting Up The Tests&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Tests are set up in the Arrange / Act / Assert fashion, the pattern first mentioned by software developer Bill Wake in 2001 regarding the Extreme Programming movement (See &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://xp123.com/3a-arrange-act-assert/&quot;&gt;XP123 / 3a- Arrange, Act. Assert&lt;/a&gt; ).&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;Arrange&lt;/b&gt;: Get the test data, open the browsers&lt;/li&gt;&lt;li&gt;&lt;b&gt;Act&lt;/b&gt;: Navigate to the page and login &lt;/li&gt;&lt;li&gt;&lt;b&gt;Assert&lt;/b&gt;: Do we have the proper heading (&amp;quot;Secure Area&amp;quot;), url, and alert message that we have logged into a secure area? &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Finally, it&amp;apos;s time to write our first test suite! &lt;b&gt;Note:&lt;/b&gt; This code is in the &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/login.spec.ts?ref_type=heads&quot;&gt;GitLab project bun-create-playwright, under tests/login.spec.ts&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;   
&lt;pre style=&quot;text-align: left&quot;&gt;&lt;code&gt;import { test, expect } from &amp;quot;@playwright/test&amp;quot;;
import { LoginPage } from &amp;quot;./pages/LoginPage&amp;quot;;
import { SecurePage } from &amp;quot;./pages/SecureAreaPage&amp;quot;;
import credentials from &amp;quot;./data/credentials.json&amp;quot; with { type: &amp;quot;json&amp;quot; };
import messages from &amp;quot;./data/messages.json&amp;quot; with { type: &amp;quot;json&amp;quot; };&lt;/code&gt;&lt;/pre&gt;We are now importing files into our test and setting up variables to store the information such as:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;The &amp;quot;test&amp;quot; and &amp;quot;expect&amp;quot; methods from Playwright. &lt;/li&gt;&lt;li&gt;The &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/pages/LoginPage.ts?ref_type=heads&quot;&gt;LoginPage&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/pages/SecureAreaPage.ts?ref_type=heads&quot;&gt;SecureAreaPage&lt;/a&gt; page objects we have set up. &lt;/li&gt;&lt;li&gt;The &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/data/credentials.json?ref_type=heads&quot;&gt;credentials&lt;/a&gt; stored in a JSON file that we have gone over.&lt;/li&gt;&lt;li&gt;A separate json file that stores all &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright/-/blob/main/tests/data/messages.json?ref_type=heads&quot;&gt;messages&lt;/a&gt; such as &amp;quot;You logged into a secure area!&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;&lt;br&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Set Up Constants for the Test Suite&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;test.describe(&amp;quot;Login&amp;quot;, () =&amp;gt; {
  const validUser = credentials.valid.username;
  const validPassword = credentials.valid.password;
  const invalidUser = credentials.invalid.username;
  const invalidPassword = credentials.invalid.password;
&lt;/code&gt;&lt;/pre&gt;
Here, we are setting up a describe block, one of the &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-test#test-describe&quot;&gt;methods in Playwright Test&lt;/a&gt;, declaring a group of tests, giving the test the title of &amp;quot;Login&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Then, to make the test more readable, instead of passing a three part credentials call, I am storing them in appropriately named variables. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;These variables, validUser, validPassword, etc, we are declaring as type &amp;quot;const&amp;quot;, also known as constants. If we accidentally change these values when the test is running, an error will be thrown. (Read more at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-test#test-describe&quot;&gt;TypeScript.org / Handbook / Variable Declarations&lt;/a&gt; ). &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;These constants, since they are set up in the describe block, will be set for ALL of the tests in this test suite. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Set Up the Individual Test&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s set up a test that we can actually log in, and get to the secure area page, and call it &amp;quot;successful login with valid credentials&amp;quot;.&lt;/div&gt;&lt;div&gt;   
  
&lt;pre&gt;&lt;code&gt;  test(&amp;quot;successful login with valid credentials&amp;quot;, {
    tag: &amp;quot;@smoke&amp;quot;,
  }, async ({ page }) =&amp;gt; {
    const loginPage = new LoginPage(page);
    const securePage = new SecurePage(page);

    await loginPage.navigate();
    await loginPage.loginAs(validUser, validPassword);
&lt;/code&gt;&lt;/pre&gt;  
  
  
  We instantiate a new instance of the LoginPage, calling it a constant &amp;quot;loginPage&amp;quot;, and do the same for the Secure Area.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Now that we declared new LoginPage, we can use the methods we have set up in our page objects, such as loginPage.navigate, and loginPage.loginAs, where we feed in the validUser and validPassword. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;How to Assert Our Test is Working&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;We have done the arranging. We have done the acting. Now, it is time for the assertions.&lt;/div&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-assertions&quot;&gt;Playwright.dev / Assertions&lt;/a&gt; mention, &amp;quot;Playwright includes test assertions in the form of expect function. To make an assertion, call expect(value) and choose a matcher that reflects the expectation. There are many &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-genericassertions&quot;&gt;generic matchers&lt;/a&gt; like toEqual, toContain, toBeTruthy that can be used to assert any conditions.&lt;br&gt;&lt;br&gt;&amp;quot;Playwright also includes web-specific &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-locatorassertions&quot;&gt;async matchers&lt;/a&gt; that will wait until the expected condition is met. &lt;br&gt;&lt;br&gt;&amp;quot;By default, the timeout for assertions is set to 5 seconds. Learn more about &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-timeouts&quot;&gt;various timeouts&lt;/a&gt;&amp;quot;.&lt;br&gt;&lt;br&gt;You can assert that an element is attached, a checkbox is checked, an element is disabled, editable, am element is empty, enabled, focused, visible, contains text or has an exact piece of text, contains a CSS class, has an accessible description or name.&lt;br&gt;&lt;br&gt;You can also check if it has a specific &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.w3.org/TR/wai-aria-1.2/#roles&quot;&gt;ARIA role&lt;/a&gt; or matches an Aria snapshot, has a certain amount of child elements, has a certain id, css, an option selected, a value. &lt;br&gt;&lt;br&gt;With pages, you can expect it to have a certain screenshot (for visual testing), has a title, url, or an OK status.&lt;br&gt;&lt;br&gt;All of these elements will be retried if they fail the first time. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You can also have some test conditions where you do not auto retry, such as expecting a value to be something, close to something, the value is &lt;b&gt;falsy &lt;/b&gt;(false, 0, or null). You can expect the value to be greaterThan, greater than or equal, less than a certain value. You can expect it to be NaN (not a number), null, or &lt;b&gt;truthy&lt;/b&gt; (not false, not 0, and not null). &lt;/div&gt;&lt;div&gt;&lt;br&gt;
    
    
&lt;pre&gt;&lt;code&gt;await expect(page).toHaveURL(/\/secure/);
    expect(await securePage.getHeading()).toBe(&amp;quot;Secure Area&amp;quot;);
    expect(await securePage.getAlertMessage()).toContain(messages.loginSuccessMessage);
  });
&lt;/code&gt;&lt;/pre&gt;
    Now, we are checking that:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;the heading we get from the SecurePage page object has the exact value &amp;quot;Secure Area&amp;quot;.&lt;/li&gt;&lt;li&gt;the alert message matches the messages we have in the messages file... &lt;/li&gt;&lt;/ul&gt;And that&amp;apos;s how you set up Page Objects and Tests using Playwright! &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;In the future, we will go over how to set up CI / CD pipelines with GitLab, but I need a break! &lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;div id=&quot;article-cWXMIz-fUT-jekXxGn7yymS2-VU-toc-section&quot;&gt;
&lt;b&gt;Bun Create Playwright:&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Part One:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/introducing-bun-new-package-manager-and.html&quot;&gt;Introducing bun, a new package manager and JavaScript runtime environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Two:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/what-happens-when-you-create-playwright.html&quot;&gt;What happens when you scaffold a Playwright framework and run installed tests using bun?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Three:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/add-type-checking-and-tsconfig-to-bun.html&quot;&gt;Add Type Checking and TSConfig to Bun-Create-Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Four:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/checking-code-with-lint-formatting-it.html&quot;&gt;Checking code with lint, formatting it with prettier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Five:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/running-tests-with-playwright-test.html&quot;&gt;Running Tests with Playwright Test Explorer and Generating Tests with Codegen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Six:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/how-playwright-frameworks-get.html&quot;&gt; How Playwright Frameworks get configured with playwright.config.ts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Seven:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/implementing-page-objects-in-playwright.html&quot;&gt;Implementing Page Objects in Playwright&lt;/a&gt;&lt;/li&gt;  
&lt;li&gt;&lt;b&gt;GitLab:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright&quot;&gt;https://gitlab.com/tjmaher/bun-create-playwright&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;





&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Whew! That was a lot!&lt;div&gt;&lt;br&gt;Happy Testing! &lt;br&gt;&lt;br&gt;
-T.J. Maher&lt;br&gt;
Software Engineer in Test&lt;br&gt;
&lt;br&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://bsky.app/profile/tjmaher1.bsky.social&quot;&gt;BlueSky&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://bit.ly/tj_youtube&quot;&gt;YouTube&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/tjmaher1&quot;&gt;LinkedIn&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://www.tjmaher.com/p/media.html&quot;&gt;Articles&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</summary><author><name>T.J. Maher</name></author><source gr:stream-id="feed/http://www.tjmaher.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://www.tjmaher.com/feeds/posts/default</id><title type="html">Adventures in Automation</title><link rel="alternate" href="https://www.tjmaher.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786903665000"><id gr:original-id="https://qualityeng.substack.com/p/test-coverage-doesnt-tell-you-its-safe">tag:google.com,2005:reader/item/00000b1e00000082</id><title type="html">Test coverage does not tell you whether a change is safe enough</title><published>2026-08-16T18:07:45Z</published><updated>2026-08-16T18:07:45Z</updated><link rel="alternate" href="https://qualityeng.substack.com/p/test-coverage-doesnt-tell-you-its-safe" 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_!dv_x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.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_!dv_x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 424w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 848w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 1272w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.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/46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.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;:423299,&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/211403980?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.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_!dv_x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 424w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 848w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 1272w, https://substackcdn.com/image/fetch/$s_!dv_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!dv_x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46719130-4dba-4ea2-b1dc-54a52968531a_2992x1670.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;Imagine two mobile app teams. They’ve both made changes to their mobile apps.&lt;/p&gt;&lt;p&gt;Team 1 is rolling out to 1% of its users and has telemetry built in. The change sits behind a feature flag and can be disabled instantly.&lt;/p&gt;&lt;p&gt;Team 2 has a solid testing strategy, with testers feeding back their experience. They plan to deploy to all their users, and if there is an issue, they would push an emergency patch.&lt;/p&gt;&lt;p&gt;Both teams have the same amount of automated test coverage, yet the conditions around the change are very different. Test coverage reduces uncertainty, but it cannot tell you on its own whether a change is safe enough to release.&lt;/p&gt;&lt;p&gt;Things like monitoring, observability, staged roll-outs, feature flags and rollback systems help manage uncertainty by giving you ways to detect, minimise and mitigate the impact if something slips through.&lt;/p&gt;&lt;p&gt;Safe change comes from the system of feedback and controls around the change, not from test suites in isolation.&lt;/p&gt;&lt;p&gt;So starting with what needs testing is probably too early. What we need to understand first is: &lt;strong&gt;What has changed, and what uncertainty does that change introduce?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This gives teams five areas to explore when thinking about whether a change is safe enough:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Understanding&lt;/strong&gt; - Do we understand what is changing, why, and what it could affect?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Consequence&lt;/strong&gt; - How bad would being wrong actually be?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Detectability&lt;/strong&gt; - How quickly and reliably would we know something had gone wrong?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Containment&lt;/strong&gt; - How much of the system/users could be affected if we’re wrong?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Reversibility&lt;/strong&gt; - How quickly and safely could we undo, disable or mitigate the change?&lt;/p&gt;&lt;p&gt;These are not independent questions, and we’ll come back to how they interact later. But it helps to look at each one in turn.&lt;/p&gt;&lt;h2&gt;Understanding&lt;/h2&gt;&lt;p&gt;Understanding what has changed and why is key, as without it you can’t understand any of the other factors.&lt;/p&gt;&lt;p&gt;For example, are you adding, changing or removing behaviour? How might that affect existing behaviours, dependencies and assumptions?&lt;/p&gt;&lt;p&gt;It’s also about understanding the environment in which the change will occur, such as affected users or operational assumptions.&lt;/p&gt;&lt;p&gt;Understanding isn’t about eliminating uncertainty. It’s about knowing enough to make good decisions about the other four factors.&lt;/p&gt;&lt;h2&gt;Consequence&lt;/h2&gt;&lt;p&gt;Consequence is about how bad it would be if the change went wrong. If the consequence is minimal, for example, correcting a typo and nothing else, you might conclude that making the change is fine. But let’s say it’s a change to a payment flow. That could affect someone financially.&lt;/p&gt;&lt;p&gt;More testing might reduce our uncertainty, but it doesn’t necessarily reduce the consequence if we are wrong.&lt;/p&gt;&lt;p&gt;So you may also want a smaller rollout, stronger monitoring, and better reversibility to minimise and mitigate any potential impact.&lt;/p&gt;&lt;h2&gt;Detectability&lt;/h2&gt;&lt;p&gt;For the consequences you’ve identified, how would you know if they were becoming a reality?&lt;/p&gt;&lt;p&gt;This is where you look at your team’s ability to monitor and observe your system. Customer support, business metrics, app telemetry, app-store feedback, synthetic checks, and other operational data can all act as signals. You need signals that help you notice and understand unexpected behaviour. But speed is also crucial here, as detecting issues within minutes rather than days can dramatically reduce how long users are exposed to them.&lt;/p&gt;&lt;h2&gt;Containment&lt;/h2&gt;&lt;p&gt;If consequence is about the impact of something going wrong, then containment is how much exposure you allow.&lt;/p&gt;&lt;p&gt;For instance, imagine a failure in a new sign-up flow that affects your product’s ability to bring on new users. If it affects only 0.5% of new subscribers for a week, that might be more tolerable than if it affected 100% of new users for a week.&lt;/p&gt;&lt;p&gt;This is where you’d be thinking about how you roll out changes to users.&lt;/p&gt;&lt;h2&gt;Reversibility&lt;/h2&gt;&lt;p&gt;Reversibility is as it sounds: if, for whatever reason, a change shouldn’t remain in production, how easily can we reverse that change?&lt;/p&gt;&lt;p&gt;But rollbacks are not the only way to reverse a change. Disabling a feature, switching traffic, restoring data, pushing a patch and falling back to known behaviour are all ways to reverse a change.&lt;/p&gt;&lt;p&gt;A good approach to reversibility is to prefer the option that introduces the least amount of change, since a complex recovery process can introduce additional uncertainty to an issue.&lt;/p&gt;&lt;p&gt;Interestingly, for some teams, their reversibility strategy can also be their default containment approach. So instead of trying to contain an issue, they reverse it as soon as they detect it. Because of this, approaches to containment and reversibility can be conflated.&lt;/p&gt;&lt;h2&gt;So, what makes a change safe enough?&lt;/h2&gt;&lt;p&gt;These five factors are not gates to pass or a step-by-step decision framework to follow. They help you understand what evidence teams need before deciding a change is safe enough to release.&lt;/p&gt;&lt;p&gt;A change with high consequence, but poor detectability and weak reversibility, should make the team cautious. But a change with high uncertainty, fast detectability, strong containment and near-instant reversibility may be fine to gradually roll out.&lt;/p&gt;&lt;p&gt;The five factors influence one another, but they do not cancel each other out. Loss of user data is still loss of user data even if it affects less than 1% of users. Strength in one factor can change how much uncertainty we’re willing to accept elsewhere, but it doesn’t make the other factors irrelevant.&lt;/p&gt;&lt;p&gt;And even then, confidence in an individual change is not the same as confidence in the whole product. Changes interact, so we still need feedback about how the wider system behaves.&lt;/p&gt;&lt;p&gt;Taken together, this is why test coverage does not tell you whether a change is safe enough. It is one source of information within a wider set of system feedback and controls around the change.&lt;/p&gt;&lt;p&gt;Whether a change is safe enough is a judgement we make from the evidence and controls around it.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;p&gt;If this helped you think differently about what makes a change safe enough, subscribe to receive future Quality Engineering posts on testing, uncertainty, risk and building quality in.&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;:&amp;quot;button-wrapper&amp;quot;}&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;</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="1786869886000"><id gr:original-id="https://www.lifeofqa.com/p/the-thinking-toolkit-of-a-software">tag:google.com,2005:reader/item/00000fe80000001f</id><title type="html">The Thinking Toolkit of a Software Tester</title><published>2026-08-16T08:44:46Z</published><updated>2026-08-16T08:44:46Z</updated><link rel="alternate" href="https://www.lifeofqa.com/p/the-thinking-toolkit-of-a-software" type="text/html"></link><summary type="html">&lt;p&gt;Yesterday (August 15, 2026) , I had the opportunity to speak at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://nstqb.org/events/QA-c-2026&quot;&gt;QA Connect 2026. &lt;/a&gt;&lt;br&gt;&lt;strong&gt;&lt;span&gt;My topic was:&lt;/span&gt;&lt;br&gt;The Thinking Toolkit of a Software Tester.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The idea for this talk came from something I have noticed throughout my testing career.&lt;br&gt;When testers face uncertainty, the difficult part is often not operating the tool.&lt;br&gt;It is deciding how to approach the problem.&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;p&gt;&lt;em&gt;You open an unfamiliar product.&lt;br&gt;Where do you start?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;You observe something strange.&lt;br&gt;How do you decide whether it is actually a problem?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;A developer changes a small piece of code just before release.&lt;br&gt;What deserves regression attention?&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;These aren’t Playwright questions.&lt;/span&gt;&lt;br&gt;&lt;span&gt;They aren’t Postman questions.&lt;/span&gt;&lt;br&gt;&lt;span&gt;They aren’t SQL questions.&lt;/span&gt;&lt;br&gt;&lt;span&gt;They are testing questions.&lt;/span&gt;&lt;br&gt;&lt;span&gt;And there isn’t always one correct answer.&lt;/span&gt;&lt;br&gt;&lt;span&gt;That is where thinking tools can help.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;During my talk, I explored three heuristics that have influenced how I approach different testing problems:&lt;/span&gt;&lt;br&gt;&lt;strong&gt;SFDIPOT&lt;/strong&gt;&lt;span&gt;, &lt;/span&gt;&lt;strong&gt;FEW HICCUPPS&lt;/strong&gt;&lt;span&gt;, and &lt;/span&gt;&lt;strong&gt;RCRCRC&lt;/strong&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;But the session wasn’t really about learning three acronyms.&lt;br&gt;It was about something more useful:&lt;br&gt;How can we give ourselves better ways to think when the answer isn’t obvious?&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span&gt;For those who attended the session, this article goes through the ideas again at a slower pace.&lt;/span&gt;&lt;br&gt;&lt;span&gt;For those who couldn’t attend, here is what we explored.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;What Is a Heuristic Anyway?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Before getting into SFDIPOT or FEW HICCUPPS, there is an important distinction to make.&lt;br&gt;A heuristic is not a rule.&lt;br&gt;It isn’t a procedure.&lt;br&gt;It isn’t a guarantee.&lt;br&gt;And it certainly isn’t another checklist we must complete.&lt;/p&gt;&lt;p&gt;I think of a heuristic as a thinking aid.&lt;br&gt;It gives us prompts when we’re dealing with uncertainty.&lt;br&gt;That matters because testing is full of uncertainty.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;We rarely have perfect requirements.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;We rarely have unlimited time.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;We rarely understand the entire system.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;We rarely know every possible consequence of a change.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So experienced testers develop ways of generating useful questions.&lt;br&gt;Some come from experience.&lt;br&gt;Some come from mistakes.&lt;br&gt;Some come from conversations.&lt;br&gt;And some come from heuristics developed and shared by other testers.&lt;br&gt;The important part is not remembering the acronym.&lt;br&gt;The important part is whether it helps you see something you weren’t seeing before.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;❶I Have a Product. Where Do I Start?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Imagine this.&lt;br&gt;Tomorrow you join a new company.&lt;br&gt;The product is WhatsApp.&lt;br&gt;Your manager tells you:&lt;br&gt;“Spend the next hour testing it.”&lt;br&gt;That’s all.&lt;br&gt;No test cases.&lt;br&gt;No detailed documentation.&lt;br&gt;No predefined scenarios.&lt;br&gt;Where would you begin?&lt;/p&gt;&lt;p&gt;This is where &lt;strong&gt;SFDIPOT&lt;/strong&gt;, created by James Bach as part of the Heuristic Test Strategy Model, can be useful.&lt;br&gt;SFDIPOT gives us seven perspectives:&lt;br&gt;Structure, Functions, Data, Interfaces, Platform, Operations, Time.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;The mistake would be to treat those as seven sections that must be completed.&lt;br&gt;Instead, think of them as seven places from which we can look at the same product.&lt;/span&gt;&lt;/em&gt;&lt;/p&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_!BNUd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.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_!BNUd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 424w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 848w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 1272w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;1673&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.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;:1674,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:548034,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.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_!BNUd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 424w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 848w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 1272w, https://substackcdn.com/image/fetch/$s_!BNUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!BNUd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b372f5-d4e9-4446-a03b-f39f62ae5539_1470x1690.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;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!1nCl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.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_!1nCl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 424w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 848w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;1028&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/d65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.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;:1028,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:270007,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.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_!1nCl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 424w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 848w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!1nCl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!1nCl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65050a8-8cd7-4f94-b2ac-99a6a01137b0_1456x1028.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;div data-callout=&quot;true&quot;&gt;&lt;p&gt;&lt;span&gt;Now look at what happened.&lt;/span&gt;&lt;br&gt;&lt;span&gt;SFDIPOT didn’t tell us: &lt;/span&gt;&lt;em&gt;“Execute these 50 test cases.”&lt;/em&gt;&lt;br&gt;&lt;span&gt;It changed the questions we were capable of asking.&lt;/span&gt;&lt;br&gt;&lt;span&gt;That’s the value.&lt;/span&gt;&lt;br&gt;&lt;strong&gt;When I’m stuck, sometimes I don’t need another testing tool. I need another perspective.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;❷Something Looks Wrong. Compared to What?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Now suppose our exploration reveals something strange.&lt;br&gt;Maybe an edited message loses its reactions.&lt;br&gt;Maybe an icon suddenly behaves differently.&lt;br&gt;Maybe a workflow feels unnecessarily complicated.&lt;br&gt;We say:&lt;br&gt;&lt;em&gt;“This looks wrong.”&lt;/em&gt;&lt;br&gt;But why?&lt;br&gt;This is where another question becomes extremely useful:&lt;br&gt;&lt;strong&gt;Compared to what?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;That question is at the heart of &lt;strong&gt;FEW HICCUPPS&lt;/strong&gt;, a heuristic developed by James Bach and Michael Bolton.&lt;br&gt;It reminds us that when we evaluate software, we’re always comparing what we observe against some source of expectation.&lt;br&gt;Those sources are often called test oracles.&lt;br&gt;Requirements can be an oracle.&lt;br&gt;But they are not the only oracle.&lt;/p&gt;&lt;blockquote&gt;&lt;h3&gt;&lt;strong&gt;Imagine WhatsApp Introduces Edit Message&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The requirement says: &lt;em&gt;“Users should be able to edit a sent message.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;You send a message. You edit it. The text changes.&lt;br&gt;Requirement satisfied? Maybe.&lt;br&gt;Testing finished? No.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;Suppose editing a message removes all existing reactions. Nothing in the requirement mentioned reactions. Is that still worth investigating? Of course.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Why? Because we have other sources of expectations.&lt;/p&gt;&lt;/blockquote&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_!Ig9H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.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_!Ig9H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 424w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 848w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 1272w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;1484&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/c8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.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;:1484,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:295086,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.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_!Ig9H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 424w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 848w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 1272w, https://substackcdn.com/image/fetch/$s_!Ig9H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!Ig9H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8117a11-3afd-4846-8242-d8ed57f66678_1458x1486.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;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!5vBb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.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_!5vBb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 424w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 848w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;1604&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.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;:1604,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:343913,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.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_!5vBb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 424w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 848w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 1272w, https://substackcdn.com/image/fetch/$s_!5vBb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!5vBb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7332da-ef03-4b36-b871-14991c7e1809_1460x1608.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;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!qrba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.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_!qrba!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 424w, https://substackcdn.com/image/fetch/$s_!qrba!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 848w, https://substackcdn.com/image/fetch/$s_!qrba!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 1272w, https://substackcdn.com/image/fetch/$s_!qrba!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;1242&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/b02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.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;:1242,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:257631,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.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_!qrba!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 424w, https://substackcdn.com/image/fetch/$s_!qrba!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 848w, https://substackcdn.com/image/fetch/$s_!qrba!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 1272w, https://substackcdn.com/image/fetch/$s_!qrba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!qrba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb02f5641-8a26-4af5-a813-7148d989b3a4_1458x1244.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;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!c1kZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.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_!c1kZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 424w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 848w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 1272w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1456&quot; height=&quot;785&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/fe2e6433-7338-4068-9335-30158dc39248_1458x786.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;:785,&amp;quot;width&amp;quot;:1456,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:138134,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.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_!c1kZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 424w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 848w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 1272w, https://substackcdn.com/image/fetch/$s_!c1kZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!c1kZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe2e6433-7338-4068-9335-30158dc39248_1458x786.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;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;❸Something Changed. What Should I Regress?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Now we reach another familiar testing problem.&lt;br&gt;It’s Thursday afternoon.&lt;br&gt;Release is Friday morning.&lt;br&gt;A developer tells you: &lt;em&gt;“I fixed the login issue.”&lt;/em&gt;&lt;br&gt;Then comes the sentence every tester knows:&lt;br&gt;&lt;strong&gt;“Can you quickly do regression?”&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Okay.&lt;br&gt;What exactly should we regress?&lt;br&gt;Run everything?&lt;br&gt;Only login? Authentication? Sessions? Payments? Profile? Notifications?&lt;br&gt;Different devices? Different browsers?&lt;/p&gt;&lt;p&gt;Teams often default to one of two approaches:&lt;br&gt;Run everything.&lt;br&gt;Or: Test only what changed.&lt;br&gt;Neither is automatically correct.&lt;br&gt;A better question is: &lt;strong&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;Where is this change most likely to create meaningful risk?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is where Karen N. Johnson’s &lt;strong&gt;RCRCRC&lt;/strong&gt; heuristic can help.&lt;br&gt;It gives us six perspectives:&lt;/p&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_!AhyI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.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_!AhyI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 424w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 848w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 1272w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1182&quot; height=&quot;1682&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/e26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.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;:1682,&amp;quot;width&amp;quot;:1182,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:430347,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.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_!AhyI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 424w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 848w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 1272w, https://substackcdn.com/image/fetch/$s_!AhyI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!AhyI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26ef1eb-5d21-4468-bc47-9ef49b6adc7d_1182x1682.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;div data-callout=&quot;true&quot;&gt;&lt;p&gt;&lt;span&gt;Look at how the conversation changed.&lt;/span&gt;&lt;br&gt;&lt;span&gt;We stopped asking: &lt;/span&gt;&lt;em&gt;“How many regression tests should we execute?”&lt;/em&gt;&lt;br&gt;&lt;span&gt;And started asking: &lt;/span&gt;&lt;strong&gt;&lt;span data-color=&quot;#b45f06&quot; style=&quot;color: rgb(180, 95, 6)&quot;&gt;“Where did this change create uncertainty?”&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;&lt;span&gt;That is a much more useful way to think about regression.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;Three Problems. Three Thinking Aids.&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;This was the connection I wanted to make during the talk.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;SFDIPOT&lt;/strong&gt; helps when I’m asking:&lt;br&gt;&lt;em&gt;Where could I explore?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;FEW HICCUPPS&lt;/strong&gt; helps when I’m asking:&lt;br&gt;&lt;em&gt;Compared to what should I evaluate what I’m seeing?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;RCRCRC&lt;/strong&gt; helps when I’m asking:&lt;br&gt;&lt;em&gt;Where should I focus after change?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;They solve different thinking problems.&lt;br&gt;But they have something important in common.&lt;br&gt;None of them executes a test.&lt;br&gt;None of them finds a bug.&lt;br&gt;None of them decides whether something matters.&lt;br&gt;They help us do those things.&lt;br&gt;And that distinction matters.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;The Heuristic Is Not the Tester&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;There is a danger in articles like this.&lt;br&gt;Someone could bookmark it.&lt;br&gt;Memorize every acronym.&lt;br&gt;Create three checklists.&lt;br&gt;Add them to a testing template.&lt;br&gt;And completely miss the point.&lt;/p&gt;&lt;p&gt;Knowing SFDIPOT doesn’t make someone a good tester.&lt;br&gt;Neither does knowing FEW HICCUPPS.&lt;br&gt;Neither does knowing RCRCRC.&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;p&gt;&lt;span&gt;Because a heuristic cannot observe the product for you.&lt;/span&gt;&lt;br&gt;&lt;span&gt;It cannot recognize surprise.&lt;/span&gt;&lt;br&gt;&lt;span&gt;It cannot understand your stakeholders.&lt;/span&gt;&lt;br&gt;&lt;span&gt;It cannot decide which risk deserves today’s limited testing time.&lt;/span&gt;&lt;br&gt;&lt;span&gt;It cannot know when one of its own prompts is irrelevant.&lt;/span&gt;&lt;strong&gt;&lt;br&gt;That’s judgment.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And judgment develops through experience, observation, mistakes, conversations, study, reflection, and deliberate practice.&lt;br&gt;A heuristic should stimulate judgment, not replace it.&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;What Sits Underneath All Three?&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;If we remove the acronyms, what remains?&lt;br&gt;A few habits that I think matter far more.&lt;/p&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_!Gbt4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.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_!Gbt4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 424w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 848w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1180&quot; height=&quot;1692&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.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;:1692,&amp;quot;width&amp;quot;:1180,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:345097,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.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_!Gbt4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 424w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 848w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!Gbt4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!Gbt4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e45fae8-5c26-42f9-a6e6-3cfe5c8e32ad_1180x1692.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;div&gt;&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://substackcdn.com/image/fetch/$s_!5H8Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.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_!5H8Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 424w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 848w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 1272w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;1176&quot; height=&quot;694&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.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;:694,&amp;quot;width&amp;quot;:1176,&amp;quot;resizeWidth&amp;quot;:null,&amp;quot;bytes&amp;quot;:130678,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.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_!5H8Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 424w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 848w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 1272w, https://substackcdn.com/image/fetch/$s_!5H8Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!5H8Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41829359-fe1c-40f0-a9b3-54889d11ddf5_1176x694.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;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;And Yes, AI Belongs in This Conversation&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;AI can generate test ideas.&lt;br&gt;It can create test data.&lt;br&gt;Write automation.&lt;br&gt;Analyze logs.&lt;br&gt;Explain code.&lt;br&gt;Summarize requirements.&lt;br&gt;Suggest edge cases.&lt;br&gt;All useful.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;But imagine AI gives you 150 test scenarios.&lt;br&gt;Now what?&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Which ones matter?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Which are duplicates dressed differently?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Which assumptions did the model make?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;What important context did you fail to provide?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Which risk matters most to your customers?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Which apparently intelligent suggestion is irrelevant to this release?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;And what question didn’t you think to ask AI in the first place?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;p&gt;&lt;span&gt;Generating more possibilities doesn’t remove the need for judgment.&lt;/span&gt;&lt;br&gt;&lt;span&gt;Sometimes it increases it.&lt;/span&gt;&lt;br&gt;&lt;span&gt;As tools become more capable, testers need to become better at deciding what information deserves attention.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Try This in Your Next Testing Session&lt;/strong&gt;&lt;/h2&gt;&lt;p style=&quot;text-align: center&quot;&gt;You don’t need to memorize any acronym from this article. Instead, try three questions.&lt;/p&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_!sC19!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.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_!sC19!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 424w, https://substackcdn.com/image/fetch/$s_!sC19!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 848w, https://substackcdn.com/image/fetch/$s_!sC19!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 1272w, https://substackcdn.com/image/fetch/$s_!sC19!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 1456w&quot; sizes=&quot;100vw&quot;&gt;&lt;img width=&quot;580&quot; height=&quot;231&quot; data-attrs=&quot;{&amp;quot;src&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.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;:470,&amp;quot;width&amp;quot;:1176,&amp;quot;resizeWidth&amp;quot;:580,&amp;quot;bytes&amp;quot;:107541,&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://www.lifeofqa.com/i/211389308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.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_!sC19!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 424w, https://substackcdn.com/image/fetch/$s_!sC19!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 848w, https://substackcdn.com/image/fetch/$s_!sC19!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 1272w, https://substackcdn.com/image/fetch/$s_!sC19!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png 1456w&quot; src=&quot;https://substackcdn.com/image/fetch/$s_!sC19!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F956ba6cd-df5b-4d1e-af98-a196a3aa3489_1176x470.png&quot;&gt;&lt;/picture&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;span&gt;Don’t worry about completing every letter.&lt;/span&gt;&lt;br&gt;&lt;span&gt;Use whatever helps the investigation.&lt;/span&gt;&lt;br&gt;&lt;span&gt;Ignore whatever doesn’t.&lt;/span&gt;&lt;strong&gt;&lt;br&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;The heuristic serves the tester. The tester doesn’t serve the heuristic.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;When I prepared &lt;em&gt;The Thinking Toolkit of a Software Tester&lt;/em&gt;, I wasn’t trying to teach people three acronyms.&lt;br&gt;I wanted to make something else visible.&lt;/p&gt;&lt;p&gt;Testing often happens in situations where we don’t have complete information.&lt;br&gt;We don’t know every risk.&lt;br&gt;We don’t know every user behavior.&lt;br&gt;We don’t know every consequence of a change.&lt;br&gt;We don’t even always know what “correct” means until we start investigating.&lt;br&gt;That’s why thinking matters.&lt;/p&gt;&lt;p&gt;SFDIPOT can help us see a product from another perspective.&lt;br&gt;FEW HICCUPPS can help us question the basis of our judgments.&lt;br&gt;RCRCRC can help us reason about regression without blindly running everything.&lt;br&gt;But none of them is the testing.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;The tester is still observing.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The tester is still questioning.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The tester is still building and revising models.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The tester is still evaluating evidence.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The tester is still making judgments under uncertainty.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The heuristics simply give that thinking somewhere to start.&lt;/p&gt;&lt;p&gt;So if you attended my QA Connect session and eventually forget what every letter in SFDIPOT stands for, I’m perfectly fine with that.&lt;br&gt;I would rather you remember the questions.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Where else could I look?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Compared to what?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;What changed, and where did that create risk?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;And perhaps the most important one: &lt;strong&gt;What don’t I understand yet?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Because tools will change.&lt;br&gt;Frameworks will change.&lt;br&gt;AI will change.&lt;br&gt;The products we test will change.&lt;/p&gt;&lt;p&gt;But uncertainty isn’t going anywhere.&lt;br&gt;And as long as we’re testing under uncertainty, our ability to observe, question, investigate, evaluate, and make informed judgments will matter.&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;p&gt;&lt;strong&gt;                           That’s the thinking toolkit I wanted to talk about.&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;span data-color=&quot;#2563eb&quot; style=&quot;color: rgb(37, 99, 235)&quot;&gt;Not something you install.&lt;br&gt;Not something you complete.&lt;br&gt;Something you keep developing every time you test.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;If you found this useful, you might also enjoy these articles:&lt;/em&gt;&lt;/p&gt;&lt;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;3e746ca7-a79a-4e2a-a423-84dbf813162c&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;Testing isn&amp;apos;t about following perfect steps. It&amp;apos;s about wrestling with uncertainty, trusting your gut, and finding problems others miss. Let&amp;apos;s talk about how to think, not just what to check.&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;🧠 Critical Thinking in Testing: When Things Get Messy&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:200170262,&amp;quot;name&amp;quot;:&amp;quot;Deepak Karn&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;👋 I am Deepak, a Software Test Engineer. I enjoy exploring innovative testing approaches, sharing insights, and helping others navigate the world of software testing. Let’s learn and grow together!&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd89aef-73d7-46e4-808b-e24883e8873d_640x640.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;2025-08-18T11:49:01.464Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/18c0cbec-7c1e-4d5d-be23-6950f0497455_1024x1536.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/critical-thinking-in-testing-when&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:171254729,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:7,&amp;quot;comment_count&amp;quot;:4,&amp;quot;publication_id&amp;quot;:2282918,&amp;quot;publication_name&amp;quot;:&amp;quot;LifeOfQA&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!7ABd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca2b04c-1640-4028-b36a-37342a054521_1024x1024.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:true,&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;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;1b783893-db12-428b-a5be-4b8795992e09&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;Most conversations about becoming more productive as a tester quickly end up talking about automation frameworks, CI/CD pipelines, or test execution.&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;Every Serious Tester Should Build Their Own Testing Toolkit&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:200170262,&amp;quot;name&amp;quot;:&amp;quot;Deepak Karn&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;👋 I am Deepak, a Software Test Engineer. I enjoy exploring innovative testing approaches, sharing insights, and helping others navigate the world of software testing. Let’s learn and grow together!&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd89aef-73d7-46e4-808b-e24883e8873d_640x640.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-07-14T07:35:48.096Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/a2f4229a-a738-41e2-9c9d-ed77410ec010_2584x1726.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/every-serious-tester-should-build&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:206973248,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:0,&amp;quot;comment_count&amp;quot;:0,&amp;quot;publication_id&amp;quot;:2282918,&amp;quot;publication_name&amp;quot;:&amp;quot;LifeOfQA&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!7ABd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca2b04c-1640-4028-b36a-37342a054521_1024x1024.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:true,&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;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;27c44cb7-fece-4cec-9234-38b307b3c48e&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;My ConfQ 2026 Talk&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;Testing Beyond Checks&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:200170262,&amp;quot;name&amp;quot;:&amp;quot;Deepak Karn&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;👋 I am Deepak, a Software Test Engineer. I enjoy exploring innovative testing approaches, sharing insights, and helping others navigate the world of software testing. Let’s learn and grow together!&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd89aef-73d7-46e4-808b-e24883e8873d_640x640.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-07-06T11:38:01.111Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/2e7869f9-5517-464f-969b-404efce969fc_3360x1744.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/testing-beyond-checks&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:205478712,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:0,&amp;quot;comment_count&amp;quot;:0,&amp;quot;publication_id&amp;quot;:2282918,&amp;quot;publication_name&amp;quot;:&amp;quot;LifeOfQA&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!7ABd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca2b04c-1640-4028-b36a-37342a054521_1024x1024.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:true,&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;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;fb870a19-d551-401b-9823-a35181453262&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;Every few months, the same headlines return:&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;AI vs Human Is the Wrong Debate&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:200170262,&amp;quot;name&amp;quot;:&amp;quot;Deepak Karn&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;👋 I am Deepak, a Software Test Engineer. I enjoy exploring innovative testing approaches, sharing insights, and helping others navigate the world of software testing. Let’s learn and grow together!&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd89aef-73d7-46e4-808b-e24883e8873d_640x640.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-06-01T06:44:54.814Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/af61a60d-2afb-4644-ad45-93254cf65afc_1498x994.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/ai-vs-human-is-the-wrong-debate&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:200077926,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:4,&amp;quot;comment_count&amp;quot;:2,&amp;quot;publication_id&amp;quot;:2282918,&amp;quot;publication_name&amp;quot;:&amp;quot;LifeOfQA&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!7ABd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca2b04c-1640-4028-b36a-37342a054521_1024x1024.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:true,&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;div data-attrs=&quot;{&amp;quot;nodeId&amp;quot;:&amp;quot;9a39d495-8169-4dbd-a806-47a279700403&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;Can Developers Test?&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;Can Developers Test?&amp;quot;,&amp;quot;publishedBylines&amp;quot;:[{&amp;quot;id&amp;quot;:200170262,&amp;quot;name&amp;quot;:&amp;quot;Deepak Karn&amp;quot;,&amp;quot;bio&amp;quot;:&amp;quot;👋 I am Deepak, a Software Test Engineer. I enjoy exploring innovative testing approaches, sharing insights, and helping others navigate the world of software testing. Let’s learn and grow together!&amp;quot;,&amp;quot;photo_url&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd89aef-73d7-46e4-808b-e24883e8873d_640x640.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;2025-10-14T07:13:34.387Z&amp;quot;,&amp;quot;cover_image&amp;quot;:&amp;quot;https://substack-post-media.s3.amazonaws.com/public/images/7c258a04-705b-436e-a2e6-f8701aad620f_1536x1024.png&amp;quot;,&amp;quot;cover_image_alt&amp;quot;:null,&amp;quot;canonical_url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/can-developers-test&amp;quot;,&amp;quot;section_name&amp;quot;:null,&amp;quot;video_upload_id&amp;quot;:null,&amp;quot;id&amp;quot;:176116999,&amp;quot;type&amp;quot;:&amp;quot;newsletter&amp;quot;,&amp;quot;reaction_count&amp;quot;:3,&amp;quot;comment_count&amp;quot;:0,&amp;quot;publication_id&amp;quot;:2282918,&amp;quot;publication_name&amp;quot;:&amp;quot;LifeOfQA&amp;quot;,&amp;quot;publication_logo_url&amp;quot;:&amp;quot;https://substackcdn.com/image/fetch/$s_!7ABd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ca2b04c-1640-4028-b36a-37342a054521_1024x1024.png&amp;quot;,&amp;quot;belowTheFold&amp;quot;:true,&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;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;If you found this helpful, stay connected with &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Life of QA&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; for more real-world testing experiences, tips, and lessons from the journey!&lt;/strong&gt;&lt;/p&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://www.lifeofqa.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://www.lifeofqa.com/subscribe?&quot;&gt;&lt;span&gt;Subscribe now&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://www.lifeofqa.com/p/the-thinking-toolkit-of-a-software/comments&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Leave a comment&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://www.lifeofqa.com/p/the-thinking-toolkit-of-a-software/comments&quot;&gt;&lt;span&gt;Leave a comment&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://buymeacoffee.com/lifeofqa&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;☕️ Buy me a coffee&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://buymeacoffee.com/lifeofqa&quot;&gt;&lt;span&gt;☕️ Buy me a coffee&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary><author><name>Deepak Karn</name></author><source gr:stream-id="feed/https://www.lifeofqa.com/feed"><id>tag:google.com,2005:reader/feed/https://www.lifeofqa.com/feed</id><title type="html">LifeOfQA</title><link rel="alternate" href="https://www.lifeofqa.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786809033000"><id gr:original-id="http://henrikwarne.com/?p=2626">tag:google.com,2005:reader/item/0000030f00000010</id><category term="Learning"></category><category term="Programming"></category><category term="Testing"></category><category term="claude"></category><category term="flaky tests"></category><category term="LLM"></category><category term="testing"></category><category term="tests"></category><title type="html">Lessons Learned from Fixing Flaky Tests with Claude</title><published>2026-08-15T15:50:33Z</published><updated>2026-08-15T15:50:33Z</updated><link rel="alternate" href="https://henrikwarne.com/2026/08/15/lessons-learned-from-fixing-flaky-tests-with-claude/" type="text/html"></link><summary type="html">&lt;p&gt;We recently sped up our integration tests by a factor of ten by running many of them in parallel. There were several flaky tests in the new test suite. Claude was really useful in getting rid of almost all flakyness, but I made some mistakes along the way. Here is what I learnt.&lt;/p&gt;



&lt;figure&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg&quot;&gt;&lt;img width=&quot;500&quot; height=&quot;185&quot; data-attachment-id=&quot;2625&quot; data-permalink=&quot;https://henrikwarne.com/pxl_20260809_074659139/&quot; data-orig-file=&quot;https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg&quot; data-orig-size=&quot;4000,1487&quot; data-comments-opened=&quot;1&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;1.7&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;Pixel 9a&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;1786268819&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;4.53&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;29&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0.00099&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;latitude&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;longitude&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;PXL_20260809_074659139&quot; data-image-description data-image-caption data-large-file=&quot;https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=500&quot; alt data-orig-srcset=&quot;https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=500 500w, https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=1000 1000w, https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=150 150w, https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=300 300w, https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=768 768w&quot; src=&quot;https://henrikwarne.com/wp-content/uploads/2026/08/pxl_20260809_074659139-e1786791646792.jpg?w=1000&quot;&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;span id=&quot;article-_pKGLgqGtStM2lxan32cveWk_SY-more-2626&quot;&gt;&lt;/span&gt;



&lt;p&gt;Our system is very well covered by integration tests. We have a complete local system running, and all integration tests interact with the running system via FIX connections (traffic) and HTTP connections (administration). Previously, our 1360 integration tests ran sequentially, and took around 40 minutes to complete. A recent rewrite got the running time down to around 4 minutes instead. The gain comes from being able to run many tests in parallel.&lt;/p&gt;



&lt;p&gt;To be able to run tests fast in parallel, the test suite relies on instruments that are defined once, then reused for many tests. This however makes the tests vulnerable to interference between tests. After the rewrite, there were typically a few tests each run that failed. If the test is run in isolation, it passes. So this is the definition of a flaky test: it passes in isolation, but may fail (due to timing issues) when run as part of a larger test suite.&lt;/p&gt;



&lt;p&gt;Even though it is fairly easy to try the test in isolation after a failing run, it is much better to get rid of the flakiness once and for all.&lt;/p&gt;



&lt;h3&gt;1. False Start&lt;/h3&gt;



&lt;p&gt;I was not very familiar with the testing framework, but I thought Claude would be good at finding and fixing the flaky tests. Each failing test produced a stack trace from where it failed. Often, the stack trace would just show where a wait for a desired state timed out, so the underlying cause was not obvious. Claude excelled at finding the causes of flakiness. So I got carried away, and accepted and committed the proposed fixes without really understanding the rationales. Since the problems appeared randomly, it is not always easy to tell if the underlying problem had actually been fixed.&lt;/p&gt;



&lt;p&gt;The flaky tests became noticeably fewer, but did not disappear completely. When I asked my colleague, who had ported many of the test cases, to review the changes, he questioned many of the commits. Several of them sounded quite plausible, but had no effect. I realized that I did not understand most of the fixes, but had just blindly accepted whatever Claude suggested.&lt;/p&gt;



&lt;h3&gt;2. Understanding&lt;/h3&gt;



&lt;p&gt;So I started over, and this time took the time to really understand each fix. I would ask Claude about all aspects of the fix I did not understand. Many times, Claude was correct, and I learnt more about how the tests and the framework work. But occasionally, I would get these types of responses when I questioned the solutions:&lt;/p&gt;



&lt;p&gt;&lt;em&gt;“You’re right to push on this, and I need to walk back what I said”&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;“Fair challenge — let me be honest about what I can and can’t demonstrate.”&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;“So I was overstating it earlier”&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Eventually, through our joint effort, we would arrive at a solution. By not blindly accepting Claude’s suggestions, I learnt a lot more about the tests, and I avoided adding pointless code to the tests.&lt;/p&gt;



&lt;h3&gt;3. Claude is Very Capable&lt;/h3&gt;



&lt;p&gt;In many of the cases, Claude did a fantastic job of finding the cause of the flakiness. Getting stack traces analyzed is a breeze, as is crosschecking multiple log files, checking the time stamps for overlapping actions. Claude’s encyclopedic knowledge of Java and associated frameworks really helps. However, because Claude is so good in so many cases, it is easy to assume that all of its output is correct. &lt;/p&gt;



&lt;h3&gt;4. Faster Understanding&lt;/h3&gt;



&lt;p&gt;I have really come to appreciate how Claude can explain not only a proposed solution, but also more broadly, the existing code in general. It is now much faster for me to understand existing code. I first ask Claude to give me an overview how some part of the system works. Then I can drill down into specific areas by asking follow-up questions. &lt;/p&gt;



&lt;h3&gt;5. Unlocking New Uses&lt;/h3&gt;



&lt;p&gt;Before LLMs, it is doubtful if it would have been worth the effort to chase down all the causes of flakiness. It would simply have taken too much time, even if the end result is good to have. This probably applies to other uses as well. Something that was not worth doing before is now possible to do cheaply enough. This is great.&lt;/p&gt;



&lt;h3&gt;Conclusion&lt;/h3&gt;



&lt;p&gt;Claude was a great help in tracking down the various causes of flaky tests. However, not everything it suggests is correct. Because it does many things so well, it is very easy to just accept every change it suggests. Therefore, being able to understand if the proposed fix is valid or not is very valuable if you care about your system.&lt;/p&gt;



&lt;p&gt;Currently, less than one run in ten has a flaky test failure. Much better than before, but still some work for Claude and me to do.&lt;/p&gt;</summary><author><name>Henrik Warne</name></author><source gr:stream-id="feed/https://henrikwarne.com/category/testing/feed/"><id>tag:google.com,2005:reader/feed/https://henrikwarne.com/category/testing/feed/</id><title type="html">Testing – Henrik Warne&apos;s blog</title><link rel="alternate" href="https://henrikwarne.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786808499000"><id gr:original-id="https://thinkingtester.com/?p=1110">tag:google.com,2005:reader/item/0000065900000058</id><title type="html">How to Use AI With Your Brain</title><published>2026-08-15T15:41:39Z</published><updated>2026-08-15T15:41:39Z</updated><link rel="alternate" href="https://thinkingtester.com/how-to-use-ai-with-your-brain/" type="text/html"></link><summary type="html">&lt;p&gt;It’s been a while since I’ve written a post, mostly because I felt that between my &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.amazon.com/stores/Kristin-Jackvony/author/B0FSYDJGQ5&quot;&gt;three books&lt;/a&gt; and my blog posts, I had said everything I wanted to say about software testing. But things have changed! In the last year, AI has drastically changed the software development landscape. After working with various AI tools for a while, I now have a series of posts about AI queued up! In this post, we’ll take a look at the basics. When using AI, it’s important to continue using your brain. Here are some things to remember:&lt;/p&gt;


&lt;div&gt;
&lt;figure&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; fetchpriority=&quot;high&quot; decoding=&quot;async&quot; width=&quot;689&quot; height=&quot;1024&quot; alt data-orig-srcset=&quot;https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS-689x1024.jpg 689w, https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS-202x300.jpg 202w, https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS-768x1141.jpg 768w, https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS-1034x1536.jpg 1034w, https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS.jpg 1152w&quot; src=&quot;https://thinkingtester.com/wp-content/uploads/2026/08/MfRUS.jpg&quot; style=&quot;aspect-ratio: 0.6728515777781254; width: 209px; height: auto&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;AI is not intelligent&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;In spite of its name, artificial intelligence is not actually intelligent. The AI agents we use are based on a Large Language Model (LLM), which is a database of trillions of words. When we ask an AI agent a question, it is answering based on the information in that LLM. It makes predictions based on training and previous interactions about what you are asking and what you might want next. &lt;em&gt;Do not make the mistake of believing that the AI knows how to “think”.&lt;/em&gt; It knows how to fetch data, organize information, and make predictions.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;AI can be wrong&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;An AI is only as good as the data it was trained upon, or the data it knows how to fetch. If that data is wrong, its answer will be wrong. To use a simple example, if there are 10 websites that say that Beethoven was born in 1775 and the AI reads from only those 10 websites, it will tell you that is Beethoven’s birth year. (It’s actually 1770.) When using AI, remember to &lt;em&gt;verify its answers&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;You get what you pay for with AI&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Free versions of AI do a smaller amount of research than the paid versions to answer your questions, and they do less confirmation on their findings. The more computing power you pay for, the more sources the AI will search to have a greater level of certainty of the correct answer. When working with AI, remember to &lt;em&gt;consider the level of service you are getting&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;AI will lie to you&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;The legendary James Bach once did an exercise where he asked an AI to provide him with information about a page on his website. It confidently returned a response with great detail about the page. The page did not exist. This is called “hallucination”, and an AI will do this because &lt;em&gt;it is programmed to give you an answer even if there isn’t one&lt;/em&gt;. It will find data to make guesses about what you are looking for. I’ve experienced AI hallucination when I’ve asked it to solve a UI automation problem and it has recommended that I use methods that don’t exist.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;AI will agree with you&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;The opposite of the previous problem is that AI will agree with you whenever it can. It might stick to its opinion when you are obviously wrong, such as when you tell it that the sky is green, but if you ask it to do something in code that is not efficient or sensible, it might do it anyway because that’s what you requested. Keep this in mind when you are giving AI coding tasks, and &lt;em&gt;periodically ask it if there is a better way&lt;/em&gt; to do what you are trying to accomplish.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;AI will use too many words&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;AI has the tendency to provide wordy explanations for everything it does. This can quickly fill up your code and documentation with unnecessary text, which can make it hard for humans to read the code and interpret what is happening. And when AI generates documents, it tends to return institutional double-speak like “focusing engineering capacity on foundational platform investments that will unlock greater leverage and compound velocity over time” instead of using the simpler “prioritizing tech debt”.  AI creations that are too wordy and obtuse are referred to as “workslop”, and &lt;em&gt;workslop should be avoided so that software projects are clear, organized, and maintainable&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;AI will do things you didn’t ask it to do&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;More than once, I have caught an AI agent I created doing something I didn’t ask it to do, such as create a Python script to make its work more efficient, or find a way to get an API key that I didn’t provide it with. Others have told me they have experienced this as well. This is not only annoying, it can also be dangerous, since the agent could get access to systems that it shouldn’t have access to. When working with AI, it’s important to &lt;em&gt;set guardrails on what it is not allowed to do&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Use your brain when using AI&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;I am not saying to avoid AI. On the contrary, AI can be extremely useful and can save you massive amounts of time. But it’s important to be aware of AI’s tendencies, limitations, and dangers so you can use it wisely. In the coming weeks, I’ll be diving deeper into various AI applications with advice of how you can test it and use it.&lt;/p&gt;</summary><author><name>kristinjackvony</name></author><source gr:stream-id="feed/https://thinkingtester.com/feed/"><id>tag:google.com,2005:reader/feed/https://thinkingtester.com/feed/</id><title type="html">Think Like a Tester</title><link rel="alternate" href="https://thinkingtester.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786761020303"><id gr:original-id="tag:blogger.com,1999:blog-3868566217808655382.post-6127157635073190509">tag:google.com,2005:reader/item/000002c500000476</id><category term="bun-create-playwright"></category><title type="html">How Playwright Frameworks get configured with playwright.config.ts</title><published>2026-08-15T02:30:20Z</published><updated>2026-08-15T02:30:20Z</updated><link rel="alternate" href="https://www.tjmaher.com/2026/08/how-playwright-frameworks-get.html" type="text/html"></link><summary type="html">When we &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/introducing-bun-new-package-manager-and.html&quot;&gt;installed bun&lt;/a&gt;, a new package manager owned by Anthropic, then ran &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/what-happens-when-you-create-playwright.html&quot;&gt;bun create playwright&lt;/a&gt;&amp;quot;, a new automation framework was stood up, along with sample tests, and a Playwright configuration file. In this post, we will be examining the file generated: &lt;b&gt;playwright.config.ts&lt;/b&gt;.  &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Personally, I find the pre-generated file very hard to scan... there are so many options and documentation in the comments, it is difficult for me to focus on the code. Let&amp;apos;s examine just the code generated below. If you need to see the whole file, you can see it here: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-configuration&quot;&gt;https://playwright.dev/docs/test-configuration&lt;/a&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-configuration&quot;&gt;Playwright.dev / Configuration&lt;/a&gt; mentions, &amp;quot;Playwright has many options to configure how your tests are run. You can specify these options in the configuration file&amp;quot;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span&gt;&lt;a name=&quot;article-V3DeyWpI_nhI3kcX8WNB4FzV6fY-more&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What is Configured By Default? &lt;/h2&gt;
&lt;pre style=&quot;text-align: left&quot;&gt;&lt;code&gt;
import { defineConfig, devices } from &amp;apos;@playwright/test&amp;apos;;

export default defineConfig({
  testDir: &amp;apos;./tests&amp;apos;,
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: &amp;apos;html&amp;apos;,
 
    // baseURL: &amp;apos;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt;&amp;apos;,

    /* Collect trace when retrying the failed test. See &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/trace-viewer&quot;&gt;https://playwright.dev/docs/trace-viewer&lt;/a&gt; */
    trace: &amp;apos;on-first-retry&amp;apos;,
  },

  /* Configure projects for major browsers */
  projects: [
    {
      name: &amp;apos;chromium&amp;apos;,
      use: { ...devices[&amp;apos;Desktop Chrome&amp;apos;] },
    },

    {
      name: &amp;apos;firefox&amp;apos;,
      use: { ...devices[&amp;apos;Desktop Firefox&amp;apos;] },
    },

    {
      name: &amp;apos;webkit&amp;apos;,
      use: { ...devices[&amp;apos;Desktop Safari&amp;apos;] },
    },
});&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I know what you are thinking ...  What the heck is process.env.CI ? 2 : 0?&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;This is know as a ternary operator. It is a shorthand for: &amp;quot;If A then B, else C&amp;quot;. &lt;/li&gt;&lt;li&gt;You can run tests two ways: Locally, on your local machine, or through a CI / CD Pipeline like Jenkins, GitHub Actions, or GitLab. &lt;/li&gt;&lt;li&gt;If you are running tests on CI / CD, the process.env.CI would automatically get set. Since A is true, the value of retries would be &amp;quot;2&amp;quot;. &lt;/li&gt;&lt;li&gt;If you are running tests locally, the process.env.CI would NOT get set. Since A is false, the value &amp;quot;0&amp;quot; would be selected. &lt;/li&gt;&lt;li&gt;CI / CD pipelines would get two retries. Locally, it would get no retries and a failed test would remain failed. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Now that that is cleared up, let&amp;apos;s examine the properties:&lt;/div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;testDir: Points to the home of the tests.&lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-testconfig#test-config-fully-parallel&quot;&gt;fullyParallel&lt;/a&gt;: Allows you to set the tests to run all at once across many workers, or by one worker, tests lined up single file. By default, all tests are run all at once with multiple workers. &lt;/li&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-testconfig#test-config-forbid-only&quot;&gt;forbidOnly&lt;/a&gt;: &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Developers debugging a test, will mark that test they are working on &amp;quot;test.only()&amp;quot;. It&amp;apos;s okay to have &amp;quot;test.only()&amp;quot; locally, but you want it to complain, loudly, if you have any test still marked &amp;quot;test.only()&amp;quot; in a CI/CD pipeline. &lt;/li&gt;&lt;li&gt;If you are running the test locally, the test run wouldn&amp;apos;t pick up a process.env.CI. The CI/ CD variable would not be set, which means that the variable would be &amp;quot;undefined&amp;quot; which would resolves to false. forbidOnly would be false. No alert would be thrown if an &amp;quot;only&amp;quot; was seen, which is exactly what you wanted. &lt;/li&gt;&lt;li&gt;If you were running this in a CI/CD pipeline, you do not want test.only() to appear. Since process.env.CI would fill in a string, or set it to true, this equation would evaluate to &amp;quot;forbidOnly=true&amp;quot;. An alert would be thrown if a test running in the CI/ CD pipeline saw an &amp;quot;only&amp;quot;.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-testconfig#test-config-retries&quot;&gt;retries&lt;/a&gt;: Tests can be fragile when running on a CI/ CD platform. If it is CI/ CD, the process.env.CI would be set, by default retrying a failed test twice. If it is not set, because the test is running locally, we have the second default, which is &amp;quot;0&amp;quot;, meaning failing tests would not be rerun. &lt;/li&gt;&lt;li&gt;workers: How many workers would you like to execute tests for you?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;By default, if you are on a CI / CD pipeline running a test it will run two workers to execute a test. Playwright recommends setting the workers to &amp;quot;1&amp;quot;. &lt;/li&gt;&lt;li&gt;Running a test locally? &amp;quot;Undefined&amp;quot; means that Playwright will detect your machines hardware and boot up a number of workers equal to half your logical CPU cores without freezing your operating system.  &lt;/li&gt;&lt;li&gt;Note: GitHub Actions free tier give you virtual machines with limited resources. If you have just one worker tests will run one after another making logs and failures easier to trace. &lt;/li&gt;&lt;li&gt;Read Playwright.dev docs about &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-parallel&quot;&gt;running jobs in parallel&lt;/a&gt;, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/test-parallel#shard-tests-between-multiple-machines&quot;&gt;dividing tests into shards&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;reporter: How would you like your output? Basic &amp;quot;html&amp;quot;, with a standalone webpage? A &amp;quot;list&amp;quot; printing a detailed line per test showing pass or fail? A &amp;quot;line&amp;quot; displaying execution progress on a single terminal line? A &amp;quot;dot&amp;quot; report where passed tests are dots and failures are &amp;quot;F&amp;quot;? A &amp;quot;json&amp;quot; report? An xml &amp;quot;junit&amp;quot; style? A &amp;quot;blob&amp;quot; of a binary file that can be later merged from multiple machines? Or &amp;quot;github&amp;quot; which creates annotations in GitHub Actions? &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://playwright.dev/docs/api/class-reporter&quot;&gt;See Playuwright.dev / Reporter&lt;/a&gt;, and a &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://app.thetestingacademy.com/blog/playwright-reporters-guide&quot;&gt;list of reporters on The Testing Academy&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;By default, it has set up to run the Playwright version of Chrome, Firefox, and WebKit Safari. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;But What About Dot Env?&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If you looked in the pre-generated configuration file, there is code that looks like: &lt;/div&gt;&lt;i&gt;&lt;blockquote&gt; * Read environment variables from file.&lt;br&gt; * &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/motdotla/dotenv&quot;&gt;https://github.com/motdotla/dotenv&lt;/a&gt;&lt;br&gt; */&lt;br&gt;// import dotenv from &amp;apos;dotenv&amp;apos;;&lt;br&gt;// import path from &amp;apos;path&amp;apos;;&lt;br&gt;// dotenv.config({ path: path.resolve(__dirname, &amp;apos;.env&amp;apos;) });&lt;/blockquote&gt;&lt;/i&gt;Dotenv reads custom variables from a plain text file, injecting them into a Node.js application. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Sometimes, settings change depending where your code is running, such as on your local machine vs a production environment. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;It is a good practice to set up one .env file per environment. .env for your local. .env.production. .env.staging, etc. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;There are things such as database passwords, third party API keys, server port numbers. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;With Dotenv you can create an .env file in the root folder of your project, and write configurations like:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;PORT=3000&lt;/li&gt;&lt;li&gt;DATABASE_URL=mongodb://localhost:27817/myapp&lt;/li&gt;&lt;li&gt;STRIPE_API_KEY=&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Make sure to add the .env file into .gitignore else you might accidently push these secrets into GitLab! ... Or you can encrypt it using &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/dotenvx/dotenvx&quot;&gt;https://github.com/dotenvx/dotenvx&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;&lt;br&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What about the Mobile Viewports and Branded Browsers? &lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;You also may have seen in the boilerplate playwright.config.ts file:&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;/* Test against mobile viewports. */&lt;/i&gt;&lt;br&gt;&lt;i&gt; // {&lt;/i&gt;&lt;br&gt;&lt;i&gt; // name: &amp;apos;Mobile Chrome&amp;apos;,&lt;/i&gt;&lt;br&gt;&lt;i&gt; // use: { ...devices[&amp;apos;Pixel 5&amp;apos;] },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // {&lt;/i&gt;&lt;br&gt;&lt;i&gt; // name: &amp;apos;Mobile Safari&amp;apos;,&lt;/i&gt;&lt;br&gt;&lt;i&gt; // use: { ...devices[&amp;apos;iPhone 12&amp;apos;] },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // },&lt;/i&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt; /* Test against branded browsers. */&lt;/i&gt;&lt;br&gt;&lt;i&gt; // {&lt;/i&gt;&lt;br&gt;&lt;i&gt; // name: &amp;apos;Microsoft Edge&amp;apos;,&lt;/i&gt;&lt;br&gt;&lt;i&gt; // use: { ...devices[&amp;apos;Desktop Edge&amp;apos;], channel: &amp;apos;msedge&amp;apos; },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // {&lt;/i&gt;&lt;br&gt;&lt;i&gt; // name: &amp;apos;Google Chrome&amp;apos;,&lt;/i&gt;&lt;br&gt;&lt;i&gt; // use: { ...devices[&amp;apos;Desktop Chrome&amp;apos;], channel: &amp;apos;chrome&amp;apos; },&lt;/i&gt;&lt;br&gt;&lt;i&gt; // },&lt;/i&gt;&lt;br&gt;&lt;br&gt;If you want Playwright to simulate how your website looks and behaves on mobile devices, you can comment out the mobile viewport section. Mobile Chrome simulates a Google Pixel 5 using Chromium, and Mobile Safari simulates an iPhone 12 using Apple&amp;apos;s WebKit engine. ( See the ThinkSys article, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://thinksys.com/qa-testing/cross-browser-testing-with-playwright/&quot;&gt;Cross Browser Testing with Playwright in 2026&lt;/a&gt; )&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Sometimes, emulations are not enough, and you want to actually test on Microsoft Edge or Google Chrome. With this setup, you can launch the actual browsers. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;... The next post, we will dive into setting up actual test and page objects.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;
&lt;div id=&quot;article-V3DeyWpI_nhI3kcX8WNB4FzV6fY-toc-section&quot;&gt;
&lt;b&gt;Bun Create Playwright:&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Part One:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/introducing-bun-new-package-manager-and.html&quot;&gt;Introducing bun, a new package manager and JavaScript runtime environment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Two:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/what-happens-when-you-create-playwright.html&quot;&gt;What happens when you scaffold a Playwright framework and run installed tests using bun?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Three:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/add-type-checking-and-tsconfig-to-bun.html&quot;&gt;Add Type Checking and TSConfig to Bun-Create-Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Four:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/checking-code-with-lint-formatting-it.html&quot;&gt;Checking code with lint, formatting it with prettier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Five:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/running-tests-with-playwright-test.html&quot;&gt;Running Tests with Playwright Test Explorer and Generating Tests with Codegen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Six:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/how-playwright-frameworks-get.html&quot;&gt; How Playwright Frameworks get configured with playwright.config.ts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Part Seven:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/2026/08/implementing-page-objects-in-playwright.html&quot;&gt;Implementing Page Objects in Playwright&lt;/a&gt;&lt;/li&gt;  
&lt;li&gt;&lt;b&gt;GitLab:&lt;/b&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://gitlab.com/tjmaher/bun-create-playwright&quot;&gt;https://gitlab.com/tjmaher/bun-create-playwright&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;  
  
  
  &lt;div&gt;

Happy Testing! &lt;br&gt;&lt;br&gt;
-T.J. Maher&lt;br&gt;
Software Engineer in Test&lt;br&gt;
&lt;br&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://bsky.app/profile/tjmaher1.bsky.social&quot;&gt;BlueSky&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://bit.ly/tj_youtube&quot;&gt;YouTube&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/tjmaher1&quot;&gt;LinkedIn&lt;/a&gt; | &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;http://www.tjmaher.com/p/media.html&quot;&gt;Articles&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</summary><author><name>T.J. Maher</name></author><source gr:stream-id="feed/http://www.tjmaher.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/http://www.tjmaher.com/feeds/posts/default</id><title type="html">Adventures in Automation</title><link rel="alternate" href="https://www.tjmaher.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786735889000"><id gr:original-id="https://medium.com/p/192e23f31e2b">tag:google.com,2005:reader/item/0000089f00000068</id><title type="html">Quality Management System has the same parts but how it is operating is changing</title><published>2026-08-14T19:31:29Z</published><updated>2026-08-14T19:31:29Z</updated><link rel="alternate" href="https://fishouthebox.medium.com/quality-management-system-has-the-same-parts-but-how-it-is-operating-is-changing-192e23f31e2b?source=rss-43716d3850af------2" type="text/html"></link><summary type="html">&lt;p&gt;I’m working on my thinking for a Quality Management System workshop I am doing in under 2 months. As part of this I can’t help but think about how to make it relevant to the changes AI is having to this and what questions might be sent my way. So this blog post is working through meandering thoughts. Figuring things out as I go.&lt;/p&gt;&lt;h4&gt;The first question I had was, if I could go back in time today, what would I use AI for?&lt;/h4&gt;&lt;p&gt;The example I can think of is &lt;strong&gt;defect trends &lt;/strong&gt;chucking it a whole load of data and telling me what area of the product it comes from and the product quality criteria it relates to (functional/non functional). Then recommending top 5 areas to work on based on that information. I remember walking into a team that was very reactive, countless issues after every release and they hired me to solve that problem. I spent literally hours going through 12 months of bugs reports, categorising them and then building out test coverage to build a safety net. It worked. We had a substantial reduction.&lt;/p&gt;&lt;blockquote&gt;What is the first thing that comes to mind for you when answering this question?&lt;/blockquote&gt;&lt;h4&gt;Proactive and Reactive Business Operations&lt;/h4&gt;&lt;p&gt;From there I was thinking about different operational states —proactive and reactive — a company can be in both, but the ideal would be to be in a more proactive than reactive state.&lt;/p&gt;&lt;p&gt;Proactive — Planning ahead and preventing bugs.&lt;/p&gt;&lt;p&gt;Reactive — responding to issues and customer complaints.&lt;/p&gt;&lt;p&gt;Some companies, in my experience can lean towards one of these.&lt;/p&gt;&lt;h4&gt;AI assisted versus AI driven&lt;/h4&gt;&lt;p&gt;Then what I was thinking about are the different levels of AI adoption.&lt;/p&gt;&lt;p&gt;There’s two key spectrums that I can think of and then a journey to get from one to the other. AI assisted is that the human decides what to do, but the AI helps them do it faster. Then there is AI Autonomous where AI takes care of the testing but there is Governance and oversight (a bit like a test manager).&lt;/p&gt;&lt;p&gt;In-between that there is AI Trusted — finding evidence that tells us the outputs are as expected. Over time the goal would be to go from reviewing everything to review exceptions.&lt;/p&gt;&lt;p&gt;I don’t really know the percentage of where companies are right now. My guess would be lots of AI assisted, next would be AI Trusted and AI Autonomous — Are we even there yet?&lt;/p&gt;&lt;p&gt;A key question I have thought about is&lt;/p&gt;&lt;blockquote&gt;Why should we let AI make testing decisions when we don’t trust it’s outputs?&lt;/blockquote&gt;&lt;p&gt;Recently that’s the question I’ve been thinking through. I had this situation where I walked into a refinement session to talk about a piece of work and there were acceptance criteria, half were repetitive and had to be removed and there were a whole bunch of risks we hadn’t discussed. It feels in a way, right now, AI creates even more work for us. As well as that I feel in the past we had lots of conversations about how AI doesn’t produce very good tests. Now the question is, so why are they not good tests? What is the definition of good for testing? (Lots of back to basic pondering thoughts).&lt;/p&gt;&lt;p&gt;For AI to be fully autonomous, how do we get there? Could an experienced tester give all of it’s knowledge to AI. How would one even go about that? My thought to this would be to break it down and think about recurring issus. Poor requirements, lack of system testing, bad change management process and tackle them one by one. Ideally what problems your company are facing in a priority order.&lt;/p&gt;&lt;p&gt;Overall, planning-control-continuous improvement in a quality managment system is still the same, yet what we need to ponder on is how the operations of the system in tech is changing. Lots to think about and experiments to set up.&lt;/p&gt;</summary><author><name>Melissa Fisher</name></author><source gr:stream-id="feed/https://medium.com/feed/@fishouthebox"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@fishouthebox</id><title type="html">Stories by Melissa Fisher on Medium</title><link rel="alternate" href="https://medium.com/@fishouthebox?source=rss-43716d3850af------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786735889000"><id gr:original-id="https://medium.com/p/192e23f31e2b">tag:google.com,2005:reader/item/00000a2b00000050</id><title type="html">Quality Management System has the same parts but how it is operating is changing</title><published>2026-08-14T19:31:29Z</published><updated>2026-08-14T19:31:29Z</updated><link rel="alternate" href="https://fishouthebox.medium.com/quality-management-system-has-the-same-parts-but-how-it-is-operating-is-changing-192e23f31e2b?source=rss-43716d3850af------2" type="text/html"></link><summary type="html">&lt;p&gt;I’m working on my thinking for a Quality Management System workshop I am doing in under 2 months. As part of this I can’t help but think about how to make it relevant to the changes AI is having to this and what questions might be sent my way. So this blog post is working through meandering thoughts. Figuring things out as I go.&lt;/p&gt;&lt;h4&gt;The first question I had was, if I could go back in time today, what would I use AI for?&lt;/h4&gt;&lt;p&gt;The example I can think of is &lt;strong&gt;defect trends &lt;/strong&gt;chucking it a whole load of data and telling me what area of the product it comes from and the product quality criteria it relates to (functional/non functional). Then recommending top 5 areas to work on based on that information. I remember walking into a team that was very reactive, countless issues after every release and they hired me to solve that problem. I spent literally hours going through 12 months of bugs reports, categorising them and then building out test coverage to build a safety net. It worked. We had a substantial reduction.&lt;/p&gt;&lt;blockquote&gt;What is the first thing that comes to mind for you when answering this question?&lt;/blockquote&gt;&lt;h4&gt;Proactive and Reactive Business Operations&lt;/h4&gt;&lt;p&gt;From there I was thinking about different operational states —proactive and reactive — a company can be in both, but the ideal would be to be in a more proactive than reactive state.&lt;/p&gt;&lt;p&gt;Proactive — Planning ahead and preventing bugs.&lt;/p&gt;&lt;p&gt;Reactive — responding to issues and customer complaints.&lt;/p&gt;&lt;p&gt;Some companies, in my experience can lean towards one of these.&lt;/p&gt;&lt;h4&gt;AI assisted versus AI driven&lt;/h4&gt;&lt;p&gt;Then what I was thinking about are the different levels of AI adoption.&lt;/p&gt;&lt;p&gt;There’s two key spectrums that I can think of and then a journey to get from one to the other. AI assisted is that the human decides what to do, but the AI helps them do it faster. Then there is AI Autonomous where AI takes care of the testing but there is Governance and oversight (a bit like a test manager).&lt;/p&gt;&lt;p&gt;In-between that there is AI Trusted — finding evidence that tells us the outputs are as expected. Over time the goal would be to go from reviewing everything to review exceptions.&lt;/p&gt;&lt;p&gt;I don’t really know the percentage of where companies are right now. My guess would be lots of AI assisted, next would be AI Trusted and AI Autonomous — Are we even there yet?&lt;/p&gt;&lt;p&gt;A key question I have thought about is&lt;/p&gt;&lt;blockquote&gt;Why should we let AI make testing decisions when we don’t trust it’s outputs?&lt;/blockquote&gt;&lt;p&gt;Recently that’s the question I’ve been thinking through. I had this situation where I walked into a refinement session to talk about a piece of work and there were acceptance criteria, half were repetitive and had to be removed and there were a whole bunch of risks we hadn’t discussed. It feels in a way, right now, AI creates even more work for us. As well as that I feel in the past we had lots of conversations about how AI doesn’t produce very good tests. Now the question is, so why are they not good tests? What is the definition of good for testing? (Lots of back to basic pondering thoughts).&lt;/p&gt;&lt;p&gt;For AI to be fully autonomous, how do we get there? Could an experienced tester give all of it’s knowledge to AI. How would one even go about that? My thought to this would be to break it down and think about recurring issus. Poor requirements, lack of system testing, bad change management process and tackle them one by one. Ideally what problems your company are facing in a priority order.&lt;/p&gt;&lt;p&gt;Overall, planning-control-continuous improvement in a quality managment system is still the same, yet what we need to ponder on is how the operations of the system in tech is changing. Lots to think about and experiments to set up.&lt;/p&gt;</summary><author><name>Melissa Fisher</name></author><source gr:stream-id="feed/https://fishouthebox.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://fishouthebox.medium.com/feed</id><title type="html">Stories by Melissa Fisher on Medium</title><link rel="alternate" href="https://medium.com/@fishouthebox?source=rss-43716d3850af------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786683600000"><id gr:original-id="https://kato-coaching.com/?p=25979">tag:google.com,2005:reader/item/00000d0a00000028</id><category term="Critical Thinking"></category><category term="DevOps"></category><category term="QED"></category><category term="Software Quality"></category><category term="testing"></category><title type="html">Singing in the Dark</title><published>2026-08-14T05:00:00Z</published><updated>2026-08-14T05:00:00Z</updated><link rel="alternate" href="https://kato-coaching.com/singing-in-the-dark/" type="text/html"></link><summary type="html">I have just come back from presenting at CAST 2026 in Cocoa Beach, and something that’s been bugging me for a while finally clicked. Somewhere in every testing event I have been to in the last fifteen years, someone makes the case that testers are undervalued, and the case is usually made well. I saw […]</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="1786665600000"><id gr:original-id="https://debbie.codes/blog/how-to-get-started-with-grok-bot">tag:google.com,2005:reader/item/00000fe300000038</id><category term="ai"></category><category term="agents"></category><title type="html">How to Get Started with Grok Bot</title><published>2026-08-14T00:00:00Z</published><updated>2026-08-14T00:00:00Z</updated><link rel="alternate" href="https://debbie.codes/blog/how-to-get-started-with-grok-bot" type="text/html"></link><summary type="html">Grok Bot just dropped. I downloaded it on a Mac the same day and recorded myself setting it up. Not a feature list. What I actually clicked, what worked, and which bots I would create.</summary><author><name>debbie@debbie.codes (Debbie O&apos;Brien)</name></author><source gr:stream-id="feed/https://debbie.codes/feed.xml"><id>tag:google.com,2005:reader/feed/https://debbie.codes/feed.xml</id><title type="html">Debbie Codes</title><link rel="alternate" href="https://debbie.codes" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786595463000"><id gr:original-id="https://medium.com/p/d48e9a72392a">tag:google.com,2005:reader/item/00000a87000000cc</id><category term="software-engineering"></category><category term="vibe-coding"></category><category term="quality-assurance"></category><category term="software-development"></category><category term="software-testing"></category><title type="html">AI Is Making Software Cheap to Build. Trust Is Still Expensive.</title><published>2026-08-13T04:31:03Z</published><updated>2026-08-13T04:31:03Z</updated><link rel="alternate" href="https://manishsaini74.medium.com/ai-is-making-software-cheap-to-build-trust-is-still-expensive-d48e9a72392a?source=rss-2afcb904d789------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://manishsaini74.medium.com/ai-is-making-software-cheap-to-build-trust-is-still-expensive-d48e9a72392a?source=rss-2afcb904d789------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1672/1*5qWdvgXC7PzmyzSIcl2REg.png&quot; width=&quot;1672&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;When software creation becomes dramatically cheaper, the real bottleneck shifts from building systems to proving they deserve our trust.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://manishsaini74.medium.com/ai-is-making-software-cheap-to-build-trust-is-still-expensive-d48e9a72392a?source=rss-2afcb904d789------2&quot;&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Manish Saini</name></author><source gr:stream-id="feed/https://manishsaini74.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://manishsaini74.medium.com/feed</id><title type="html">Stories by Manish Saini on Medium</title><link rel="alternate" href="https://medium.com/@manishsaini74?source=rss-2afcb904d789------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786579200000"><id gr:original-id="https://debbie.codes/blog/i-tested-if-grok-bot-could-book-my-flights">tag:google.com,2005:reader/item/00000fe300000037</id><category term="ai"></category><category term="agents"></category><title type="html">I Tested If Grok Bot Could Book My Flights</title><published>2026-08-13T00:00:00Z</published><updated>2026-08-13T00:00:00Z</updated><link rel="alternate" href="https://debbie.codes/blog/i-tested-if-grok-bot-could-book-my-flights" type="text/html"></link><summary type="html">I asked a Grok Bot to act as my travel agent and book flights. Close, but missing the last step. Here is the video of what worked and what didn&amp;apos;t.</summary><author><name>debbie@debbie.codes (Debbie O&apos;Brien)</name></author><source gr:stream-id="feed/https://debbie.codes/feed.xml"><id>tag:google.com,2005:reader/feed/https://debbie.codes/feed.xml</id><title type="html">Debbie Codes</title><link rel="alternate" href="https://debbie.codes" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786563599000"><id gr:original-id="6a57c9a8eb99a500010ba30c">tag:google.com,2005:reader/item/0000071a000000f8</id><title type="html">Workroom PlayTime 063: Spot the Difference</title><published>2026-08-12T19:39:59Z</published><updated>2026-08-12T19:39:59Z</updated><link rel="alternate" href="https://www.workroom-productions.com/workroom-playtime-063-spot-the-difference/" type="text/html"></link><summary type="html">&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://storage.ghost.io/c/7e/30/7e30843b-2abb-494a-ab80-0e931d8ae9a9/content/images/2026/08/puzzle040std-1.jpg&quot; alt=&quot;Workroom PlayTime 063: Spot the Difference&quot;&gt;&lt;p&gt;This week&amp;apos;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.workroom-productions.com/workroom-playtime/&quot; rel=&quot;noreferrer&quot;&gt;Workroom PlayTime&lt;/a&gt; &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; going to happen, but it is not going to be on Thursday (tomorrow / today depending on where you are). We&amp;apos;ll try for &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://this-ti.me/?uts=1786732200&amp;amp;tz=Europe%2FLondon&amp;amp;name=Workroom+PlayTime+063&quot; rel=&quot;noreferrer&quot;&gt;Friday 14 August at 7:30pm UK time&lt;/a&gt;. If that doesn&amp;apos;t suit you, and you want to find another, ping me and if we can find a mutual one, I&amp;apos;ll send another invite to subscribers.&lt;/p&gt;&lt;p&gt;We&amp;apos;ll run &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.workroom-productions.com/spot-the-difference-puzzle-40/&quot;&gt;Spot the Difference (Puzzle 40)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We&amp;apos;ll gather on Zoom. These exercises are for everyone, for free. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.workroom-productions.com/#/portal/signup&quot; rel=&quot;noreferrer&quot;&gt;All subscribers&lt;/a&gt; get to play together most weeks, paid subscribers get a guaranteed slot or  rerun if we&amp;apos;re full. If you get this in an email or can see the &lt;strong&gt;joining info&lt;/strong&gt; section below, then you&amp;apos;re a subscriber and have access to the Zoom etc. for the workshop. If you&amp;apos;d like to bring a friend, you can do that. I&amp;apos;ll say yes until I&amp;apos;ve got too many.&lt;/p&gt;&lt;p&gt;Use this Savvycal link to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://savvycal.com/workroomprds/workroom-playtime-063&quot; rel=&quot;noreferrer&quot;&gt;book your spot&lt;/a&gt; and get reminders. &lt;em&gt;Note to regulars: You should find it easier to use the Zoom link – it&amp;apos;s in several places. Tell me if you like it or if it&amp;apos;s a problem.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;↓&lt;em&gt;  signed-in subscribers will see joining info and links below &lt;/em&gt;↓&lt;/p&gt;</summary><author><name>James Lyndsay</name></author><source gr:stream-id="feed/https://www.workroom-productions.com/rss/"><id>tag:google.com,2005:reader/feed/https://www.workroom-productions.com/rss/</id><title type="html">Workroom Productions</title><link rel="alternate" href="https://www.workroom-productions.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786563045000"><id gr:original-id="6a7cc79af11f2c00012c209e">tag:google.com,2005:reader/item/0000071a000000f7</id><category term="Exercises"></category><title type="html">Spot the Difference (Puzzle 40)</title><published>2026-08-12T19:30:45Z</published><updated>2026-08-12T19:30:45Z</updated><link rel="alternate" href="https://www.workroom-productions.com/spot-the-difference-puzzle-40/" type="text/html"></link><summary type="html">&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://storage.ghost.io/c/7e/30/7e30843b-2abb-494a-ab80-0e931d8ae9a9/content/images/2026/08/puzzle040std-2.jpg&quot; alt=&quot;Spot the Difference (Puzzle 40)&quot;&gt;&lt;p&gt;Open &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.workroom-productions.com/puzzle-040/&quot; rel=&quot;noreferrer&quot;&gt;Puzzle 40&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.workroom-productions.com/puzzle-040b/&quot; rel=&quot;noreferrer&quot;&gt;Puzzle 40b&lt;/a&gt; in tabs.&lt;/p&gt;&lt;p&gt;There is &lt;em&gt;one&lt;/em&gt; substantial difference, and it&amp;apos;s not obvious to the casual explorer. The exercise is to find it. &lt;/p&gt;&lt;p&gt;You will find it by exploring, modelling and comparing. You will find it by comparing sources. You will find it by asking me for hints. You will find it by asking me. You might aim your exploration by thinking what I could easily change in one place that leads to a non-obvious change in behaviour. You can probably think of more.&lt;/p&gt;&lt;p&gt;First person (to be sure of what it might be) gains kudos – and becomes a helper and hinter to the others, &lt;em&gt;if they ask&lt;/em&gt;. Or maybe we&amp;apos;ll all explore together, and so we&amp;apos;ll find it together. &lt;/p&gt;&lt;p&gt;At the start of the exercise, we&amp;apos;ll agree collective ground rules – how long we&amp;apos;ll spend, how collaborative we&amp;apos;ll be. We might also exchange individual handicaps – maybe you won&amp;apos;t look at the source, or you&amp;apos;ll only use specific tools.&lt;/p&gt;</summary><author><name>James Lyndsay</name></author><source gr:stream-id="feed/https://www.workroom-productions.com/rss/"><id>tag:google.com,2005:reader/feed/https://www.workroom-productions.com/rss/</id><title type="html">Workroom Productions</title><link rel="alternate" href="https://www.workroom-productions.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1786542327783"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-2063332111569231333">tag:google.com,2005:reader/item/0000050e00000134</id><category term="Sketchnotes"></category><category term="System Seeing"></category><category term="Systems"></category><title type="html">See It! Days 20-24</title><published>2026-08-12T13:45:27Z</published><updated>2026-08-12T13:45:27Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html" type="text/html"></link><summary type="html">&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/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/s898/See_It.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;528&quot; height=&quot;640&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;898&quot; data-original-width=&quot;740&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/w528-h640/See_It.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
  This post is part of a series showing my working through the 2025 Advent of
  System Seeing exercises set by Ruth Malan. For background see the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-system-seeing-adventure.html&quot;&gt;introduction&lt;/a&gt;. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-1-5.html&quot;&gt;Days 1-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html&quot;&gt;Days 6-9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html&quot;&gt;Days 10-16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html&quot;&gt;Days 17-19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Days 20-24 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  As we reach the final few days of exercises we&amp;apos;re into reflection and
  consolidation of ideas. 
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 20&lt;/h3&gt;
&lt;p&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day20.html&quot;&gt;Task&lt;/a&gt;: (1) Look
  across the past 19 days and draw out concepts related to systems (2) Consider
  what else you&amp;apos;d like to add (3) Jot down some questions (4) What topic would
  you like to add, as the focus of another page on your System zine?
&lt;/p&gt;
&lt;p&gt;
  Components: parts, relationships, boundaries, effects, feedback, change over
  time, inputs and outputs, failure modes, context, constraints.
&lt;/p&gt;
&lt;p&gt;
  Tools: zoom in/out, follow a specific path, take actor perspectives, use
  multiple models, identify needs (and who they belong to), identify causes (and
  the causes of the causes), focus on the parts of the system that matter today,
  don&amp;apos;t forget how we got here, identify constraints and assumptions.
&lt;/p&gt;
&lt;p&gt;Questions/Missing:&lt;/p&gt;
&lt;ul style=&quot;text-align: left&quot;&gt;
  &lt;li&gt;Seeking/exploiting existing perspectives&lt;/li&gt;
  &lt;li&gt;Comparing and contrasting models&lt;/li&gt;
  &lt;li&gt;Consolidating insights from different models&lt;/li&gt;
  &lt;li&gt;Maintaining (or not) models over time &lt;/li&gt;
  &lt;li&gt;Driving towards the most important information&lt;/li&gt;
  &lt;li&gt;When to use what type of model&lt;/li&gt;
  &lt;li&gt;
    Provide ways to understand the value of different kinds of model 
  &lt;/li&gt;
  &lt;li&gt;More focus on collaboration&lt;/li&gt;
  &lt;li&gt;Where do feeling and instinct come into this?&lt;/li&gt;
  &lt;li&gt;Do more on changing the system&lt;/li&gt;
  &lt;li&gt;Why is this still an art rather than a science?&lt;/li&gt;
  &lt;li&gt;Graphical models for exploration vs for sharing information &lt;/li&gt;
  &lt;li&gt;We covered causal loops but there was nothing on stocks and flows?&lt;/li&gt;
  &lt;li&gt;
    No acknowledgement that &lt;i&gt;we &lt;/i&gt;might be part of the system? (Our
    investigations might influence actors.)
  &lt;/li&gt;
  &lt;li&gt;Unintended/unexpected/unwanted consequences&lt;/li&gt;
  &lt;li&gt;
    Models are there to explore what matters to you. It&amp;apos;s fine to model a
    subsystem. Just be  aware that&amp;apos;s what it is.
  &lt;/li&gt;
  &lt;li&gt;Judging the trustworthiness of a source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  For the zine page, I chose exploration because investigating a system
  &lt;i&gt;is&lt;/i&gt; exploration. 
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 21&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day21.html&quot;&gt;Task&lt;/a&gt;: Create a zine page on your topic from day 21, capturing related ideas,
  concepts, using expressive visual analogies and sketches to make ideas
  vivid. 
&lt;/p&gt;
&lt;h3 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/AVvXsEj7XNfpAD9b9-_ChrVBnzWJsCQvaB8kPg9HTf-ydv_EDQMYdoMOMQFJattflUpC3UyN3lNIOe0-_ikba1zwUxC9UpZmSYj1uFkJkITVQNQlQIQmsT5rf9pvVNzZ3-Zahqb7DdVhVIFhNFZAdCBZZE3MwaYD_FESs9Bj0AsiwPyek3NC0_UjUhqS3FKR7O0A/s1899/Day21_zine4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;294&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1393&quot; data-original-width=&quot;1899&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7XNfpAD9b9-_ChrVBnzWJsCQvaB8kPg9HTf-ydv_EDQMYdoMOMQFJattflUpC3UyN3lNIOe0-_ikba1zwUxC9UpZmSYj1uFkJkITVQNQlQIQmsT5rf9pvVNzZ3-Zahqb7DdVhVIFhNFZAdCBZZE3MwaYD_FESs9Bj0AsiwPyek3NC0_UjUhqS3FKR7O0A/w400-h294/Day21_zine4.jpg&quot;&gt;&lt;/a&gt; 
&lt;/h3&gt;
&lt;p&gt;
  &lt;br&gt;I wanted to get across the idea that you will need to explore the system
  you are looking at in order to understand it.
&lt;/p&gt;
&lt;p&gt;
  I wondered about using quotes like &amp;quot;the map is not the territory&amp;quot; but decided
  to try to keep it simple. There is no room for subtlety in this page: I would
  have liked to have talked about the constant change, the need to be clear
  about what you&amp;apos;re trying to accomplish, focussing on the relevant pieces and
  so on. 
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 22&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day22.html&quot;&gt;Task&lt;/a&gt;: Identify
  a challenge in the situation you have been exploring, and frame a goal related
  to that challenge where various people need to play a role. What would
  you do next? 
&lt;/p&gt;
&lt;p&gt;
  This is a nice exercise, a different dimension to the ones we&amp;apos;ve covered in
  the earlier days. It&amp;apos;s striking to me that it doesn&amp;apos;t explicitly call out
  politics as a factor. 
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 23&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day23.html&quot;&gt;Task&lt;/a&gt;: Shifting perspectives is one way to notice what we are missing or
  adding. Pick an important conversation you&amp;apos;ve recently had, and record what
  you said against what you were feeling at each stage.
&lt;/p&gt;
&lt;p&gt;
  There are, unsurprisingly, differences between the internal monologue and the
  external dialogue and, given the context, I think it can be instructive to
  take a systems view of that. Some initial thoughts on a difficult conversation
  between colleagues:
&lt;/p&gt;
&lt;ul style=&quot;text-align: left&quot;&gt;
  &lt;li&gt;
    The participants are players in a shared system (actually, in shared
    systems) 
  &lt;/li&gt;
  &lt;li&gt;
    They will be conscious that the productivity of the system as a whole
    depends on them having a smooth (enough) interaction
  &lt;/li&gt;
  &lt;li&gt;
    Stating bluntly what each of them feels might add friction to the system
  &lt;/li&gt;
  &lt;li&gt;... so social norms form part of the context&lt;/li&gt;
  &lt;li&gt;
    Social norms can vary significantly between team members (e.g. from
    different cultures)
  &lt;/li&gt;
  &lt;li&gt;
    Many factors might influence the interaction, e.g. office politics 
  &lt;/li&gt;
  &lt;li&gt;... personal interest &lt;/li&gt;
  &lt;li&gt;... relative position in the company hierarchy &lt;/li&gt;
  &lt;li&gt;... historical interactions between these participants&lt;/li&gt;
  &lt;li&gt;
    ... the subject matter, and relative levels of expertise, ownership, or
    interest in it
  &lt;/li&gt;
  &lt;li&gt;... responsibility for the outcome&lt;/li&gt;
  &lt;li&gt;... how busy the participants are&lt;/li&gt;
  &lt;li&gt;... how often they&amp;apos;ve had some version of this conversation&lt;/li&gt;
  &lt;li&gt;... how invested they are in the success of this project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  And so on. For what it&amp;apos;s worth, some of the most valuable training I ever had
  was in assertiveness, which collapses all of that stuff into a big blob, and
  focusses on being able to drive the conversation to the topics that are most
  important whatever the context. I wrote about it
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2024/07/express-listen-and-field.html&quot;&gt;here&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 24&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day24.html&quot;&gt;Task&lt;/a&gt;: 
  Wrap up the Advent(ure) in System Seeing by pulling some of your work into a
  zine. It&amp;apos;s neat to create a physical memento and it&amp;apos;s your gift to yourself
  for completing the Advent(ure)!
&lt;/p&gt;
&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/AVvXsEgS3rk-ClP-8DB92xWfqi4w2mKNIqlm7aIlBaB4Vx0KxrN3Ujx027xPwS-LDmZMeVHlco6nTFZh6zd7kE8untojsXj5StpSTNuPnfnZIxjesXzb4kmpKHRftytbWJPPXprg18qXcY418VTUkRZV53vB8ZzP6VKHk_5xrwSoMnfJmnUYHI0obqtBxEd3WQm1/s1952/Day24_zine0.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;260&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1267&quot; data-original-width=&quot;1952&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS3rk-ClP-8DB92xWfqi4w2mKNIqlm7aIlBaB4Vx0KxrN3Ujx027xPwS-LDmZMeVHlco6nTFZh6zd7kE8untojsXj5StpSTNuPnfnZIxjesXzb4kmpKHRftytbWJPPXprg18qXcY418VTUkRZV53vB8ZzP6VKHk_5xrwSoMnfJmnUYHI0obqtBxEd3WQm1/w400-h260/Day24_zine0.jpg&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
  As I had already made 8 zine pages I thought I&amp;apos;d finish off the exercises by
  making a cover. I&amp;apos;ve already said that this kind of work is exploration for
  me, so it didn&amp;apos;t take long to decide to steal the cover of Explore It! (Sorry
  Elisabeth!) 
&lt;/p&gt;
&lt;p&gt;And the full zine:&lt;/p&gt;
&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/AVvXsEicxe1KPf5t6WoTaP0301C1yGd_dah1i585EXjCCrnsOlMt_T3T4xSWKIiYYtCPezjSnuOuguQBQknrs62ELyNe0noX2LDkoZFvxS7USHpeS6d25SNPrNhitWhf3oG_Tc2hRd7KQirjSkNKRuf5A5mbTCOWa2YMICIIv_P0B6_Mshwssxy-83wdEOnR9e85/s2250/20260812_141605.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;189&quot; height=&quot;200&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2250&quot; data-original-width=&quot;2132&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicxe1KPf5t6WoTaP0301C1yGd_dah1i585EXjCCrnsOlMt_T3T4xSWKIiYYtCPezjSnuOuguQBQknrs62ELyNe0noX2LDkoZFvxS7USHpeS6d25SNPrNhitWhf3oG_Tc2hRd7KQirjSkNKRuf5A5mbTCOWa2YMICIIv_P0B6_Mshwssxy-83wdEOnR9e85/w189-h200/20260812_141605.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&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/AVvXsEjaf_E6akb-zZQKC1a5uVdKOIOGceTaQ67xHhyq3zuzHZhd3RzMuDmRVOQZpun1Rq5kNT1HQiRq7tecI5PhFr8G3peL_SG0NcavZTPVzNPLvoKtnIQIlMNGgzgSRX78uxlBCcYTwPhb3yx_J3vqbkY8xY1Llwhyphenhyphen0ZZfhfqS4ysRBHI5e6yRz0e9lLMlf8et/s3536/20260812_141616.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;200&quot; height=&quot;137&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2424&quot; data-original-width=&quot;3536&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaf_E6akb-zZQKC1a5uVdKOIOGceTaQ67xHhyq3zuzHZhd3RzMuDmRVOQZpun1Rq5kNT1HQiRq7tecI5PhFr8G3peL_SG0NcavZTPVzNPLvoKtnIQIlMNGgzgSRX78uxlBCcYTwPhb3yx_J3vqbkY8xY1Llwhyphenhyphen0ZZfhfqS4ysRBHI5e6yRz0e9lLMlf8et/w200-h137/20260812_141616.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&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/AVvXsEjLmxSL8-fElzg1wBZroK6RIkTh_bI7i1h1mBHWUHiZn_vLflhzNxgS6YBd48sbXruIHVf63NGlPZTVwTeIXeDpGNLzNOBPxnYZwLPJLKngsmgDajIf8fr230AgDhw8ojK_i6qnfiJ8S-eFP63H7kkqNYJUAwoWJqdKom3TnjFvq7j-GyqkwFkUL9WzQR_0/s3848/20260812_141624.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;200&quot; height=&quot;124&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2376&quot; data-original-width=&quot;3848&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLmxSL8-fElzg1wBZroK6RIkTh_bI7i1h1mBHWUHiZn_vLflhzNxgS6YBd48sbXruIHVf63NGlPZTVwTeIXeDpGNLzNOBPxnYZwLPJLKngsmgDajIf8fr230AgDhw8ojK_i6qnfiJ8S-eFP63H7kkqNYJUAwoWJqdKom3TnjFvq7j-GyqkwFkUL9WzQR_0/w200-h124/20260812_141624.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&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/AVvXsEgamNlD8LA7AIbKJs_22wYpq-8vato1g5_jhkE53JyDT2ZxwV-PdL8Eged7FpPo_hmlb5uWKXrWLG3e-Vr8366X7q7A8Hiqn_fB1hPWzf7YsLiedFYCeC-XVLkFXNXdvvu3dfIPKdHqGqhuogREbD_I2F2ftF1hePADGneZibrAWKDhlVCGp5RQAI3gFhnN/s3636/20260812_141630.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;200&quot; height=&quot;138&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2514&quot; data-original-width=&quot;3636&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgamNlD8LA7AIbKJs_22wYpq-8vato1g5_jhkE53JyDT2ZxwV-PdL8Eged7FpPo_hmlb5uWKXrWLG3e-Vr8366X7q7A8Hiqn_fB1hPWzf7YsLiedFYCeC-XVLkFXNXdvvu3dfIPKdHqGqhuogREbD_I2F2ftF1hePADGneZibrAWKDhlVCGp5RQAI3gFhnN/w200-h138/20260812_141630.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&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/AVvXsEisfXoZAruHEc4hPVvwcglzpAyYpSObnWTAi6XhkLg5YwtmnMrT2WkwW6OTITWwqMqi9X2vk8JytA4DnlQAHiEsYojGXtzm_VeMpOtkea61TyhN_u8IPuavWfbtMnQ76Fwozmk4W16xGWHxu_IBPMg0Ajb2tuvPAGsILj6F69Owu03aWJPXXba7wt2vpkOV/s3722/20260812_141637.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;200&quot; height=&quot;136&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2534&quot; data-original-width=&quot;3722&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisfXoZAruHEc4hPVvwcglzpAyYpSObnWTAi6XhkLg5YwtmnMrT2WkwW6OTITWwqMqi9X2vk8JytA4DnlQAHiEsYojGXtzm_VeMpOtkea61TyhN_u8IPuavWfbtMnQ76Fwozmk4W16xGWHxu_IBPMg0Ajb2tuvPAGsILj6F69Owu03aWJPXXba7wt2vpkOV/w200-h136/20260812_141637.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&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/AVvXsEixDl0HGSu1EfzpO_u-zOqNKrozPQC3M1LEyZXmVfr8v4-ZeCQ-LieisDGnEgnj2PQxeJDAZ9ngG8m32C0cBzQr3Av8u0JfqDvdccHoNz4qFVj4YSr1OOWoaWNz2EGEkPUle7Aw_KquQtbOdI_xYWOFhjjfFd_p5Uu1E7fou2TNCLnMJND-yAVxJBvL3oQF/s2808/20260812_141644.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;187&quot; height=&quot;200&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;2808&quot; data-original-width=&quot;2625&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixDl0HGSu1EfzpO_u-zOqNKrozPQC3M1LEyZXmVfr8v4-ZeCQ-LieisDGnEgnj2PQxeJDAZ9ngG8m32C0cBzQr3Av8u0JfqDvdccHoNz4qFVj4YSr1OOWoaWNz2EGEkPUle7Aw_KquQtbOdI_xYWOFhjjfFd_p5Uu1E7fou2TNCLnMJND-yAVxJBvL3oQF/w187-h200/20260812_141644.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt; &lt;span style=&quot;font-size: xx-small&quot;&gt;Image: Inspired by Explore It! by Elisabeth Hendrickson. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://pragprog.com/titles/ehxta/explore-it/&quot;&gt;Pragmatic Press&lt;/a&gt;&lt;/span&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="1786542207727"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-2853443940431813856">tag:google.com,2005:reader/item/0000050e00000133</id><category term="Sketchnotes"></category><category term="System Seeing"></category><category term="Systems"></category><title type="html">See It! Days 17-19</title><published>2026-08-12T13:43:27Z</published><updated>2026-08-12T13:43:27Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html" type="text/html"></link><summary type="html">&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/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/s898/See_It.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;528&quot; height=&quot;640&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;898&quot; data-original-width=&quot;740&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/w528-h640/See_It.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
  This post is part of a series showing my working through the 2025 Advent of
  System Seeing exercises set by Ruth Malan. For background see the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-system-seeing-adventure.html&quot;&gt;introduction&lt;/a&gt;. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-1-5.html&quot;&gt;Days 1-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html&quot;&gt;Days 6-9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html&quot;&gt;Days 10-16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Days 17-19&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html&quot;&gt;Days 20-24&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  This set of exercises is concerned with the location of a technical system
  within a social system. Spoiler: it only adds complexity.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 17&lt;/h3&gt;
&lt;p&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day17.html&quot;&gt;Task&lt;/a&gt;: (1)
  Considering the situation you’re exploring: identify systems and their
  interrelationships. How far out do we zoom? What heuristics do you use? (2)
  Pick a (socio)technical system to focus on. Write a brief description of its
  primary purpose.
&lt;/p&gt;
&lt;p&gt;
  I found the questions in the exercise the most interesting part of it this
  time.
&lt;/p&gt;
&lt;p&gt;
  &lt;i&gt;How far out do we zoom?&lt;/i&gt; This is the perennial problem in my world; I am
  &lt;i&gt;always &lt;/i&gt;trying to find ways to judge whether I have gone far enough in
  the dimensions I have identified as relevant and hoping that I identified more
  or less the correct set of dimensions. Getting the opinion of others really
  helps, as the early exercises in this series identified.
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2020/10/context-driven-or-what.html&quot;&gt;What is the edge of a context&lt;/a&gt;? 
&lt;/p&gt;
&lt;p&gt;
  &lt;i&gt;What heuristics do you use?&lt;/i&gt; I have written a lot about
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/search/label/Heuristics%20for%20Working&quot;&gt;heuristics for working&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
  For the second part of the exercise, the sociotechnical system I picked is a
  museum. My first attempt at its primary purpose was this:
&lt;/p&gt;
&lt;p style=&quot;margin-left: 40px; text-align: left&quot;&gt;
  The primary purpose of a museum is to exhibit something for public
  consumption.
&lt;/p&gt;
&lt;p&gt;
  It didn&amp;apos;t survive even light stress testing: first, because there are private
  museums and, second, because by this yardstick a cinema would be a museum. I
  iterated some more, acknowledged that I&amp;apos;m not trying to write a
  &lt;i&gt;definition &lt;/i&gt;of a museum, and ended up with this:
&lt;/p&gt;
&lt;p style=&quot;margin-left: 40px; text-align: left&quot;&gt;
  The primary purpose of a museum is to act as a memory and sense-making
  institution that curates artifacts to construct, preserve, and share knowledge
  about them and their context. 
&lt;/p&gt;
&lt;p&gt;Feels clunky, but I&amp;apos;ll live with it.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 18&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day18.html&quot;&gt;Task&lt;/a&gt;: Identify
  (and draw) the network of capabilities that enable that system from day 17 to
  be viable as a system with that purpose. 
&lt;/p&gt;
&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/AVvXsEhpAB3n9WosNlyrJ_IRSO_D2lhklkWvmbmNw7Y9fRt81oaGNgvo0V3fkgTadgLHGEEilqSeAp0e-ZWkTu1smhy1AVHee_64mouMz7dPVn77wvCmbcD1r8Q7uvO_YaFR6bv4Mg6kOujoiJfPVjBcgyx0gocMLnrc3cELV_EH5zCN3_o_SBZKfmvV0ArwlikW/s2205/Day18.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;283&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1557&quot; data-original-width=&quot;2205&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpAB3n9WosNlyrJ_IRSO_D2lhklkWvmbmNw7Y9fRt81oaGNgvo0V3fkgTadgLHGEEilqSeAp0e-ZWkTu1smhy1AVHee_64mouMz7dPVn77wvCmbcD1r8Q7uvO_YaFR6bv4Mg6kOujoiJfPVjBcgyx0gocMLnrc3cELV_EH5zCN3_o_SBZKfmvV0ArwlikW/w400-h283/Day18.jpg&quot;&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
  This exercise again makes it clear that finding a useful granularity for the
  network depends on the way in which it will be used. For example, running a
  museum requires a lot of the same basic stuff that running any non-trivial
  organisation requires. Should I have inserted a node labelled &amp;quot;standard
  organisational infrastructure&amp;quot; and emphasised only what is special to a
  museum?
&lt;/p&gt;
&lt;p&gt;
  Similarly, needs often bottom out at some kind of resource: probably money. I
  included this in a couple of places but didn&amp;apos;t want to flood the diagram with
  that. Can they be taken as read?
&lt;/p&gt;
&lt;p&gt;The task asks a couple of questions: &lt;/p&gt;
&lt;p&gt;
  &lt;i&gt;What capabilities are internal to the system?&lt;/i&gt;
  &lt;i&gt;What external (to the system) capabilities does the system depend on?&lt;/i&gt;
  Interestingly, I found that I had stopped at a system boundary (where the
  internal meets the external) without thinking much about it. I added external
  dependencies to a section only after reviewing this question. What does that
  tell us? We bring explicit and tacit biases with us to each task.
&lt;/p&gt;
&lt;p&gt;
  &lt;i&gt;If we broaden our view to more of the lifecycle of the system, what
    additional capabilities come into view? &lt;/i&gt;I didn&amp;apos;t deliberately &lt;i&gt;not&lt;/i&gt; think about system lifecycle so I feel like
  I&amp;apos;ve included some things that are relevant already, such as fundraising, HR,
  and financial or, for museums specifically, accessions and disposals.
&lt;/p&gt;
&lt;p&gt;
  &lt;i&gt;If we back up to consider the problem that users of the system face (why
    they are using the system), and explore what capabilities they need, does
    that differ from taking the system purpose as a starting point? &lt;/i&gt;I think that it doesn&amp;apos;t, although the prominence of some nodes in the network
  might be different. For example, as a museum director I care about a lot of
  things that a day visitor does not: I might sacrifice some short-term
  priorities to protect long-term survival for instance.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 19&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day19.html&quot;&gt;Task&lt;/a&gt;: Identify
  an area (in your situation) where you would like to do something and want to
  explore what you&amp;apos;ll encounter and what it will take.  
&lt;/p&gt;
&lt;p&gt;
  I can&amp;apos;t share the output from this exercise, but I can share some thoughts on
  how I like to think about this kind of problem.
&lt;/p&gt;
&lt;p&gt;
  I find that I go for a mindmap less often than I used to because I find the
  tooling (Miro in my case) too irritating and turning it into some other shape
  of model too tricky. What I tend to do now is use sticky notes which I group
  spatially, or with colour or some other attribute, and then shuffle them
  around on the whiteboard until I find a way to represent the space that helps
  me to think about the problem at hand.
&lt;/p&gt;
&lt;p&gt;
  This often results in some kind of &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2019/04/order-order.html&quot;&gt;classification of features &lt;/a&gt;of the space and compare options based on those features.  Because
  sticky notes on a whiteboard don&amp;apos;t constrain me at all, I can make informal,
  flexible tables that reflect levels of certainty, overlap, constraint and so
  on. &lt;/p&gt;&lt;p&gt;Next: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html&quot;&gt;Days 20-24&lt;/a&gt;&lt;br&gt;&lt;span style=&quot;font-size: xx-small&quot;&gt;Image: Inspired by Explore It! by Elisabeth Hendrickson. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://pragprog.com/titles/ehxta/explore-it/&quot;&gt;Pragmatic Press&lt;/a&gt;&lt;/span&gt;&lt;/p&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="1786542090876"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-8890552901616652255">tag:google.com,2005:reader/item/0000050e00000132</id><category term="Sketchnotes"></category><category term="System Seeing"></category><category term="Systems"></category><title type="html">See It! Days 10-16</title><published>2026-08-12T13:41:30Z</published><updated>2026-08-12T13:41:30Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html" type="text/html"></link><summary type="html">&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;/div&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/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/s898/See_It.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;528&quot; height=&quot;640&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;898&quot; data-original-width=&quot;740&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/w528-h640/See_It.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
  This post is part of a series showing my working through the 2025 Advent of
  System Seeing exercises set by Ruth Malan. For background see the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-system-seeing-adventure.html&quot;&gt;introduction&lt;/a&gt;.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-1-5.html&quot;&gt;Days 1-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html&quot;&gt;Days 6-9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Days 10-16&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html&quot;&gt;Days 17-19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html&quot;&gt;Days 20-24&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  This section of the Advent series is largely concerned with material I can&amp;apos;t
  share in much detail,  a practical exercise exploring a real-life
  scenario at work. I&amp;apos;ve done the exercises and given at least a little
  commentary on the value of them here.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 10&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day10.html&quot;&gt;Task&lt;/a&gt;: 1. Draw
  an organization that you have been part of  at least 3 different ways (2)
  Jot down reflections  (3) Go &amp;quot;meta” and think about the views you
  drew.&lt;br&gt; 
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&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/AVvXsEi4xIGnlhMG5LimulvZGkYZuED6X5kq5hZVQaWF3hWf-9rVTQfAtC1mZlixCP34U-g5iwleRRyqjYIV2Brwfz87RqNOd6Hy6AkH9p1B9EtMb8uJjqLuR08l1DVrL8P8pXBxPIPI1Bghmta1oCgo7eFzs1gb5NpeC3LOl9T7f5Bi75Y2USAOUFQv2LoIFwY3/s1797/Day10.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;378&quot; height=&quot;400&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1797&quot; data-original-width=&quot;1697&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4xIGnlhMG5LimulvZGkYZuED6X5kq5hZVQaWF3hWf-9rVTQfAtC1mZlixCP34U-g5iwleRRyqjYIV2Brwfz87RqNOd6Hy6AkH9p1B9EtMb8uJjqLuR08l1DVrL8P8pXBxPIPI1Bghmta1oCgo7eFzs1gb5NpeC3LOl9T7f5Bi75Y2USAOUFQv2LoIFwY3/w378-h400/Day10.jpg&quot;&gt;&lt;/a&gt;
  &lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;
  As the task suggests, it&amp;apos;s well known that org charts are, at best, an
  approximation of the way that work gets done in an organisation. The kind of
  diagram to draw depends on the perspective you want to obtain. 
&lt;/p&gt;
&lt;p&gt;
  Many of my colleagues don&amp;apos;t like Miro, but I love it because I can shuffle
  bits of model around until a view that helps me make sense of whatever I&amp;apos;m
  looking at emerges. Whiteboards are good for this too, but the ease  with
  which I can copy-paste makes the discovery phase so much more convenient with
  an electronic tool. (See e.g.
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2025/05/going-underground.html&quot;&gt;Going Underground&lt;/a&gt; where I did just that.)
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 11&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day11.html&quot;&gt;Task&lt;/a&gt;: Think of
  a situation you’d like to explore with a systems lens. Write a few paragraphs
  describing the situation. 
&lt;/p&gt;
&lt;p&gt;
  I need to understand an existing system sufficiently to test the partial
  reimplementation of it as we migrate from one stack to another for our core
  product at work. I talked about this a little in
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/07/just-looking.html&quot;&gt;Just Looking &lt;/a&gt;recently.
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 12&lt;/h3&gt;
&lt;p&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day12.html&quot;&gt;Task&lt;/a&gt;: draw
  an &lt;i&gt;Actor Map&lt;/i&gt; for the situation described on Day 11.
&lt;/p&gt;
&lt;p&gt;
  Actor maps are new to me. Making one reminded me of the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://teamonion.works/&quot;&gt;Team Onion&lt;/a&gt; model for
  collaboration  It&amp;apos;s helpful for me to externalise the motivations of
  different parties when there are potentially politics at play. (And there are
  &lt;i&gt;always &lt;/i&gt;politics at play.)
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 13&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day13.html&quot;&gt;Task&lt;/a&gt;: Jot down
  characteristics of the current state of things and what would happen if you
  did nothing to change it.
&lt;/p&gt;
&lt;p&gt;
  I didn&amp;apos;t find this valuable for my situation. Other than hypothetically, there
  is no option where my team does nothing.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 14&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day14.html&quot;&gt;Task&lt;/a&gt;: Explore
  how your situation came to be. Either focus your exploration on a textual
  narrative, or use a graphical history canvas.
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  For this exercise I chose to draw a timeline but, without significant
  research, I can&amp;apos;t give a very precise order. I think that doesn&amp;apos;t matter as
  much as understanding some significant design choices in this case but in
  general I find that the history can be an important part of the context. 
&lt;/p&gt;
&lt;p&gt;
  I try not to judge historical decisions too harshly because we tend to see the
  result rather than the state of the system at the time. I mean, come on, we&amp;apos;ve
  all done something that in retrospect looks awful because it was the pragmatic
  choice at the time.
  &lt;i&gt; Haven&amp;apos;t we?&lt;/i&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 15&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day15.html&quot;&gt;Task&lt;/a&gt;: Create a
  Value Network Map for the situation you&amp;apos;re working on.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  I superimposed this onto the actor map I created on Day 12. I like the idea of
  trying to establish tangible and intangible value flows, but find myself
  sceptical that the business cares about intangible value. Much like the
  magical org chart from Day 10, it feels like management tends to abstract a
  crude model of value generation that discards anything which doesn&amp;apos;t drive the
  bottom line directly.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 16&lt;/h3&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day16.html&quot;&gt;Task&lt;/a&gt;: Create
  another page for your zine, on the topic of constraints. 
&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/AVvXsEiZ4Iyrx6P3wZ_rFJzxLMTHb6vFhlB90Q5Oy_XU8oxbemdQupUYDiXKbKSo9vMSz9MxAiADfIqMUGiygL6mAvYufTTQJSp0b15foj5dCAPRNtm-FLBvNn1z_Djj1a76PL4HzQHFZU6ZbsjssILDQhA8uF5F7LClDZXqzHtK-wiPN4kG2jaGoSFVgBvOx2cz/s1623/Day16_zine3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;303&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1225&quot; data-original-width=&quot;1623&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ4Iyrx6P3wZ_rFJzxLMTHb6vFhlB90Q5Oy_XU8oxbemdQupUYDiXKbKSo9vMSz9MxAiADfIqMUGiygL6mAvYufTTQJSp0b15foj5dCAPRNtm-FLBvNn1z_Djj1a76PL4HzQHFZU6ZbsjssILDQhA8uF5F7LClDZXqzHtK-wiPN4kG2jaGoSFVgBvOx2cz/w400-h303/Day16_zine3.jpg&quot;&gt;&lt;/a&gt; 
&lt;/div&gt;
&lt;p&gt;
  I have long held that constraints are our friends. I prefer the term to
  requirements because I think of constraints as more general. In particular I
  think of constraints as including negatives: &amp;quot;no solution that includes X, Y,
  or Z&amp;quot; might be one, ideally with a &amp;quot;because ....&amp;quot; chaser to help the team
  understand the reasoning behind the restriction and so be able to make better
  judgements when implementation choices arise later.
&lt;/p&gt;
&lt;p&gt;
  In
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2025/08/bottom-up-or-top-down.html&quot;&gt;Bottom-up or Top-down&lt;/a&gt; I think about three types of constraints, coming from above, the
  context, or below. For example:
&lt;/p&gt;
&lt;ul style=&quot;text-align: left&quot;&gt;
  &lt;li&gt;management: use Jira for managing work items&lt;/li&gt;
  &lt;li&gt;
    market: use standard technologies to be able to integrate and compete 
  &lt;/li&gt;
  &lt;li&gt;team: we want to build our product using hexagonal architecture&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Next: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html&quot;&gt;Days 17-19&lt;br&gt;&lt;/a&gt;&lt;span style=&quot;font-size: xx-small&quot;&gt;Image: Inspired by Explore It! by Elisabeth Hendrickson. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://pragprog.com/titles/ehxta/explore-it/&quot;&gt;Pragmatic Press&lt;/a&gt;&lt;/span&gt;&lt;/p&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="1786541859378"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-3723098269792629166">tag:google.com,2005:reader/item/0000050e00000131</id><category term="Sketchnotes"></category><category term="System Seeing"></category><category term="Systems"></category><title type="html">See It! Days 6-9</title><published>2026-08-12T13:37:39Z</published><updated>2026-08-12T13:37:39Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html" type="text/html"></link><summary type="html">&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;/div&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/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/s898/See_It.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;528&quot; height=&quot;640&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;898&quot; data-original-width=&quot;740&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/w528-h640/See_It.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
  This post is part of a series showing my working through the 2025 Advent of
  System Seeing exercises set by Ruth Malan. For background see the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-system-seeing-adventure.html&quot;&gt;introduction&lt;/a&gt;. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-1-5.html&quot;&gt;Days 1-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Days 6-9&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html&quot;&gt;Days 10-16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html&quot;&gt;Days 17-19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html&quot;&gt;Days 20-24&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  In this set of exercises, the idea of feedback is introduced. Feedback is at
  the heart of systems thinking because we humans seem to be primed to view the
  world as a simple linear cause-leads-to-effect machine in which only the
  causes and effects that matter are those that (a) we desire or (b) are
  glaringly obvious.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 6&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day6.html&quot;&gt;Task&lt;/a&gt;: Watch a
  video on causal loops and take sketchnotes.
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left&quot;&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/AVvXsEiTdRWfopdvbHoUnuou-a0Y8EKw2QKOhfITLn-2SwIdZWMxBd68agToqpyeezskuysYgbSXrTfqYU9aSZE2NBEqx-qdRudX3w4OxvfItTQmKfqrRkTQkqK4dfh2Vb8lePJCL7J1SJMi_KFrtgnQukopWs-CpDwqgAm3cPo9FTroVesdMPcu5Ql6J7z5QpAl/s2438/Day6.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;295&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1796&quot; data-original-width=&quot;2438&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTdRWfopdvbHoUnuou-a0Y8EKw2QKOhfITLn-2SwIdZWMxBd68agToqpyeezskuysYgbSXrTfqYU9aSZE2NBEqx-qdRudX3w4OxvfItTQmKfqrRkTQkqK4dfh2Vb8lePJCL7J1SJMi_KFrtgnQukopWs-CpDwqgAm3cPo9FTroVesdMPcu5Ql6J7z5QpAl/w400-h295/Day6.jpg&quot;&gt;&lt;/a&gt; 
  &lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;
  I know and like this kind of diagram (&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2021/07/be-quality-detector.html&quot;&gt;Be a Quality Detector&lt;/a&gt;) but  I have struggled to build them for any system that I&amp;apos;ve looked
  at. In particular, I find the formal labelling of positive and negative loops
  to be more of a dark art than a science. The good news is that informality has
  proved sufficient for me up to now but perhaps I&amp;apos;ll learn to be more formal on
  day 7.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 7&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day7.html&quot;&gt;Task&lt;/a&gt;: Practice
  using causal loop diagrams to understand interacting effects in a system, for
  example the effect of adding lanes to a highway.
&lt;/div&gt;
&lt;h3 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/AVvXsEi4rXuXQvoz9YUS1ArE9_vFJjYii0cOtWu2eZmk2t4-onzVDWvZE9ZZGn3j1aaZ4_7vwhCtA3XClb6nIvnUiBjAa1uJwg-9gEVaEizs1eJKEPrZ6b3QVzFElFcU79T-b3W0mh3_72yxPxBHc8D7zGviXCJ6YPHREHnzhmveQnAJ-tCQJbIBnYCIQQaNbUqa/s2086/Day7.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;246&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1282&quot; data-original-width=&quot;2086&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4rXuXQvoz9YUS1ArE9_vFJjYii0cOtWu2eZmk2t4-onzVDWvZE9ZZGn3j1aaZ4_7vwhCtA3XClb6nIvnUiBjAa1uJwg-9gEVaEizs1eJKEPrZ6b3QVzFElFcU79T-b3W0mh3_72yxPxBHc8D7zGviXCJ6YPHREHnzhmveQnAJ-tCQJbIBnYCIQQaNbUqa/w400-h246/Day7.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;
  My diagram captures a scenario where I have assumed that a road is already at
  or near capacity so that throughput (say, number of cars passing a specific
  point per hour) is lower than desired. I have several problems with it
&lt;/p&gt;
&lt;p&gt;
  1. The wording in the nodes is very important. Take (A) where I instinctively
  said adding a lane to our road would result in a &amp;quot;reduction in traffic
  elsewhere.&amp;quot; This seems reasonable but makes it harder to decide whether we
  have a positive or negative relationship. Probably I should have labelled this
  node &amp;quot;amount of traffic elsewhere&amp;quot; and it&amp;apos;d be more obviously negative.
&lt;/p&gt;
&lt;p&gt;
  2. The idea of positive and negative relationships is problematic because they
  have both a mathematical and a value judgement interpretation. I suspect that
  what we&amp;apos;re really annotating is direct and inverse relationships. 
&lt;/p&gt;
&lt;p&gt;
  3. Temporality is hard to express. Both (A) and (B) are potential impacts of
  the action in this scenario, but likely at different times. How can I reflect
  that?
&lt;/p&gt;
&lt;p&gt;
  4. Some of the impacts are secondary, for example (C). How far should I go
  when thinking about them? In this artificial exercise I don&amp;apos;t have a remit so
  I noted a few and stopped.
&lt;/p&gt;
&lt;p&gt;
  5. I have drawn a dashed line (D) to indicate the temptation to loop through
  the whole cycle again, once congestion returns to the system. I would like to
  somehow indicate that other choices are available at this point.
&lt;/p&gt;
&lt;p&gt;
  6. I don&amp;apos;t know how to represent magnitude on these kinds of pictures. How
  should outcomes be balanced against on another? 
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 8&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day8.html&quot;&gt;Task&lt;/a&gt;: Create
  another page for the zine from earlier. Focus on &lt;i&gt;context: &lt;/i&gt;why do we
  consider (system) context? What are associated concepts? Is there an
  explanatory diagram that helps convey why context is important to consider?
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;
  &lt;div style=&quot;clear: both; text-align: center&quot;&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/AVvXsEgqBdeE387m9lWjtCvayWW9xS29pmiznfMrVAvS69S5xtn43H-pcQmX-7xs6284DMoADm8v4JKsdvybdsFh0aXTEsIHvf3mrXCPBHhjz414sBuZ1SeEQdsog9GKOfM7XNRhh2bHzNlzdwJJfD9yaODWwk2pjJrKOFzNCMQdQi-gGQNNyLeXUWsm6UlHTGeY/s1422/Day8_zine2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;288&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1022&quot; data-original-width=&quot;1422&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqBdeE387m9lWjtCvayWW9xS29pmiznfMrVAvS69S5xtn43H-pcQmX-7xs6284DMoADm8v4JKsdvybdsFh0aXTEsIHvf3mrXCPBHhjz414sBuZ1SeEQdsog9GKOfM7XNRhh2bHzNlzdwJJfD9yaODWwk2pjJrKOFzNCMQdQi-gGQNNyLeXUWsm6UlHTGeY/w400-h288/Day8_zine2.jpg&quot;&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;
  I spent &lt;i&gt;waaaaaay&lt;/i&gt; more time than I intended to on this one. I had in
  mind that there&amp;apos;s an interesting parallel between the &amp;quot;start with the why&amp;quot;
  call of Simon Sinek&amp;apos;s elegantly simple
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://simonsinek.com/golden-circle&quot;&gt;Golden Circle&lt;/a&gt; model and the
  idea that systems are &amp;quot;surrounded by the why&amp;quot;: the context in which a system
  sits &lt;i&gt;is&lt;/i&gt; the reason it does what it does.
&lt;/p&gt;
&lt;p&gt;I started with the basic idea of this parallel&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Why: the context. The system is the shape it is because of it.&lt;/li&gt;
  &lt;li&gt;How: the actions performed by the system.&lt;/li&gt;
  &lt;li&gt;What: the outputs from the system. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  and iterated through four or five sketches to get the one above. It&amp;apos;s the
  first time in this series that the image you&amp;apos;re seeing is not the first image
  I drew. Here&amp;apos;s some of the along-the-way versions:
&lt;/p&gt;
&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/AVvXsEgdwpQlj51LgMt9z6dy8U4abU0yHW54PPoxyPnwjxTNcDoj8n4doqZM4XDhYrBFN5LwRRyXNfVpQMBcXAYe3JwbbrdvMybw01457NjzyOD5MPbS0QtwfSavsl3BIvdg0cZhfsRqmzsP8Wo3T-sN4FVWpgTtjbQuadlVJgBju59Zz-CejMNwXHsElFqybed_/s2220/Day8_sketches.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;284&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1576&quot; data-original-width=&quot;2220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdwpQlj51LgMt9z6dy8U4abU0yHW54PPoxyPnwjxTNcDoj8n4doqZM4XDhYrBFN5LwRRyXNfVpQMBcXAYe3JwbbrdvMybw01457NjzyOD5MPbS0QtwfSavsl3BIvdg0cZhfsRqmzsP8Wo3T-sN4FVWpgTtjbQuadlVJgBju59Zz-CejMNwXHsElFqybed_/w400-h284/Day8_sketches.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  I&amp;apos;m not sure what I&amp;apos;ve done here satisfies the brief, to be honest. I
  don&amp;apos;t think that by itself my diagram really motivates the primacy of context.
  It&amp;apos;s probably less interesting to someone who hasn&amp;apos;t come across Sinek&amp;apos;s work
  too, but I think it is at least memorable and graphic.
&lt;/p&gt;
&lt;p&gt;
  Other things that I would have liked to included: showing that something
  designed in a linear way on the left can be part of a system on the right, or
  that context from analysing a system on the right can feed into the why on the
  left, but I didn&amp;apos;t want to try to superimpose that additional layer onto the
  sketch because of the risk of obscuring the core detail that&amp;apos;s already there.
&lt;/p&gt;
&lt;p&gt;
  On top of all of that, enamoured as I am with the idea I&amp;apos;ve drawn, I&amp;apos;m still
  not certain whether it holds up.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 9&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day9.html&quot;&gt;Task&lt;/a&gt;:  (1)
  Watch a short video about trees. Jot down notes (and sketches) as you watch
  it. (2) Draft a zine page on relationships.
&lt;/div&gt;
&lt;h3 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/AVvXsEjf4_l8LAOKnsJ_yrTRrHWuT7tGB2nP0V6hzNKQ1cQjo2H5HbPdoZ3pvCBgeaMEcVCHXtqYjsBtdwcyto0myZX9kIv8XYFZ2C615jNqNgRr8WV3TytTsNArwiV6YLxYsYS5mTNPT4GEeZhgvqNlx5aENFnVQrGqAFvMeARGzWW0MGe9O_BKONqjilxRaUK7/s1844/Day9.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;376&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1732&quot; data-original-width=&quot;1844&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf4_l8LAOKnsJ_yrTRrHWuT7tGB2nP0V6hzNKQ1cQjo2H5HbPdoZ3pvCBgeaMEcVCHXtqYjsBtdwcyto0myZX9kIv8XYFZ2C615jNqNgRr8WV3TytTsNArwiV6YLxYsYS5mTNPT4GEeZhgvqNlx5aENFnVQrGqAFvMeARGzWW0MGe9O_BKONqjilxRaUK7/w400-h376/Day9.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  I&amp;apos;d come across the so-called
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://en.wikipedia.org/wiki/Mycorrhizal_network&quot;&gt;Wood Wide Web&lt;/a&gt;
  before, so the basic information in the video was not new to me. What to pull
  out into my sketchnotes and then into a more general zine page on
  relationships was tough to decide, and in the end I&amp;apos;m not sure whether I&amp;apos;m
  happy with what I did.  Unlike on day 8, I am comfortable that what my
  page says is true, but I question whether it&amp;apos;s helpful.&lt;br&gt;&lt;br&gt;Next: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html&quot;&gt;Days 10-16&lt;/a&gt;&lt;br&gt;&lt;span style=&quot;font-size: xx-small&quot;&gt;Image: Inspired by Explore It! by Elisabeth Hendrickson. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://pragprog.com/titles/ehxta/explore-it/&quot;&gt;Pragmatic Press&lt;/a&gt;&lt;/span&gt;&lt;/p&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="1786541637942"><id gr:original-id="tag:blogger.com,1999:blog-1733784724667491523.post-1479747412774349473">tag:google.com,2005:reader/item/0000050e00000130</id><category term="Sketchnotes"></category><category term="System Seeing"></category><category term="Systems"></category><title type="html">See It! Days 1-5</title><published>2026-08-12T13:33:57Z</published><updated>2026-08-12T13:33:57Z</updated><link rel="alternate" href="https://qahiccupps.blogspot.com/2026/08/see-it-days-1-5.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;/div&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/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/s898/See_It.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;528&quot; height=&quot;640&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;898&quot; data-original-width=&quot;740&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzQcPt1R4gTfCANLECukcnzupKCwZUCUN5ULTjPdqkkRU_hYZXhUgzEl3WHO1FYusaJUs3kVtC9NPps334t9HFS_wHadjM83I-uBjGgc8Nj0xcGr5AEPvtZ2W0g94zEWUjYNQqMBdd758M2DC-nXYdbQpXJVwVuTt3sopQXb53NseBNUZjefktKVYY8Bqv/w528-h640/See_It.jpg&quot;&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
  This post is part of a series showing my working through the 2025 Advent of
  System Seeing exercises set by Ruth Malan. For background see the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-system-seeing-adventure.html&quot;&gt;introduction&lt;/a&gt;. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Days 1-5&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html&quot;&gt;Days 6-9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-10-16.html&quot;&gt;Days 10-16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-17-19.html&quot;&gt;Days 17-19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-20-24.html&quot;&gt;Days 20-24&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  The initial exercises introduce some core concepts and a couple of approaches
  to modelling, and encourage us to think about our work and the system we&amp;apos;re
  looking at.
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 1&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day1.html&quot;&gt;Task&lt;/a&gt;: (1) Draw a
  Bubble Diagram of a bicycle (2) Sketch a bicycle from memory (3) Pick a key
  capability [and use] sketches and words to explore and convey how it works
  (4) Reflect on what you learned. 
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;
  &lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;/div&gt;
  &lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;/div&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/AVvXsEiG21IZXlL3coLRR1ftCnoUtFoCVn74ENgebEpljkeLz_ojqBHSPzBxy6UJmxliedCnNx1hw-jaSLLNFC2XSGBmT09Kp_B56Zez_BAWfZ1BqlDFO3jN9mGtfggoBo5OQU3Cnp_RAky3zFju-Mnw1hS00KnfYHJ8Uy1aw79orphXNk2MHxkZqSxpNFMp22Gl/s2364/Day1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;299&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1768&quot; data-original-width=&quot;2364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG21IZXlL3coLRR1ftCnoUtFoCVn74ENgebEpljkeLz_ojqBHSPzBxy6UJmxliedCnNx1hw-jaSLLNFC2XSGBmT09Kp_B56Zez_BAWfZ1BqlDFO3jN9mGtfggoBo5OQU3Cnp_RAky3zFju-Mnw1hS00KnfYHJ8Uy1aw79orphXNk2MHxkZqSxpNFMp22Gl/w400-h299/Day1.jpg&quot;&gt;&lt;/a&gt;
  &lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;
  I&amp;apos;m comfortable doing what I&amp;apos;d call &amp;quot;factoring&amp;quot; which tries to find different
  angles or features or affordances of a thing that could be useful seams to
  follow when testing. I&amp;apos;ve used plenty of tools, such as the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.debonogroup.com/services/core-programs/six-thinking-hats/&quot;&gt;Six Thinking Hats&lt;/a&gt;
  or
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.satisfice.com/download/heuristic-test-strategy-model&quot;&gt;SFDIPOT &lt;/a&gt;to help with that, and represented the outcomes with a mindmap often.
&lt;/p&gt;
&lt;p&gt;
  Although my in-the-moment reflection says that I didn&amp;apos;t find the bubble
  diagram helpful, I can see now that it&amp;apos;s because I didn&amp;apos;t sacrifice any of my
  15-20 minutes to reading the (long)
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://illustrarch.com/articles/architectural-diagrams/8702-bubble-diagram-in-architecture.html&quot;&gt;reference&lt;/a&gt;. Having looked a little closer, I see that it&amp;apos;s a tool used in architecture
  and the spatial aspects (proximity and size) attempt to model features of the
  physical design, making it more like a map than a traditional mindmap, where
  the diagram&amp;apos;s topography is typically not part of the model it holds.
&lt;/p&gt;
&lt;p&gt;
  It makes me think of the building blocks of models and the hybrid models I&amp;apos;ve
  made (e.g.
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2025/05/going-underground.html&quot;&gt;Going Underground&lt;/a&gt;,
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2017/02/the-testing-kraftwerk.html&quot;&gt;The Testing Kraftwerk&lt;/a&gt;, or &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2022/12/granularity-familiarity.html&quot;&gt;Granularity Familiarity&lt;/a&gt;) and I think it&amp;apos;ll be a useful tool to have in my back pocket in future.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 2&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day2.html&quot;&gt;Task&lt;/a&gt;: Draw a
  diagram to explore the world around bicycles. Zoom out, so that &amp;quot;bicycle&amp;quot; is
  just one bubble in the centre of the diagram. 
&lt;/div&gt;
&lt;h3 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/AVvXsEimY7WqACuzfA7KR18h_jRQx0rq4XLPeFVnUFwMlDQYTerN-W906yjI9DZeoWY7pDsWCJL1qRls7Cg9pDs0vB5Z8l8vVv-qjQYPP3fTnIZz5eqwnUlonGzDs2OXT-8nPg-qRFIuBo3hxvdFFZC_u7YfY-Znpfh5UvClrGAdsW5ewgo-x_zWAEwG05Yo6trW/s2120/Day2.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;331&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1756&quot; data-original-width=&quot;2120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimY7WqACuzfA7KR18h_jRQx0rq4XLPeFVnUFwMlDQYTerN-W906yjI9DZeoWY7pDsWCJL1qRls7Cg9pDs0vB5Z8l8vVv-qjQYPP3fTnIZz5eqwnUlonGzDs2OXT-8nPg-qRFIuBo3hxvdFFZC_u7YfY-Znpfh5UvClrGAdsW5ewgo-x_zWAEwG05Yo6trW/w400-h331/Day2.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;
  &lt;i&gt;Where are the edges of the context?&lt;/i&gt; is a question I have asked myself
  many times. It&amp;apos;s fascinating to see how other participants broke the space
  around the bike down, seeing concepts that I didn&amp;apos;t and leaving out things
  that I included. Sebastian Hans
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://hachyderm.io/@sebhans/115652006224771603&quot;&gt;suggested &lt;/a&gt;something important: &amp;quot;some contexts have more depth than others, maybe
  because I have more experience riding a bike than building one.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
  That&amp;apos;s the thing: our biases are hugely influential in this kind of exercise
  and it takes conscious effort to leave them at the door. Having multiple
  people on a task can help either synchronously or by sharing the model with
  others for comment. Be careful though: I have seen conversations break down
  because two people have formed mental models that don&amp;apos;t fit together.
  Externalising the models can help massively but I find many people reluctant
  to do it.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 3&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day3.html&quot;&gt;Task&lt;/a&gt;: Use
  a Futures Wheel to explore a change that is impacting cycling or the bicycle
  industry, in terms of direct and indirect effects. 
&lt;/div&gt;
&lt;h3 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/AVvXsEhEgiowxtoTjH3L9KQXYwsOjBtGL3_rGcUuihs2fTTVFpE0HVTowYJI5ZA6Rku2VvEdZ4tvX65emxSmT6_pEcVSh8Fg1a38Ao0Ub5niO77SyD81smZ61ypUdDR321zWwrK02ahLUHx4sxSwpE-l98Cm6GqsnMNIHq9hw5ZN2MK08vn9-ClQouTVcdjSnyxE/s2268/Day3.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;254&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1446&quot; data-original-width=&quot;2268&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEgiowxtoTjH3L9KQXYwsOjBtGL3_rGcUuihs2fTTVFpE0HVTowYJI5ZA6Rku2VvEdZ4tvX65emxSmT6_pEcVSh8Fg1a38Ao0Ub5niO77SyD81smZ61ypUdDR321zWwrK02ahLUHx4sxSwpE-l98Cm6GqsnMNIHq9hw5ZN2MK08vn9-ClQouTVcdjSnyxE/w400-h255/Day3.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  Another new diagram format for me, the Futures Wheel. Again I didn&amp;apos;t spend any
  of my time reading about it in advance but this time the exercise contained
  enough clues to get me going. There&amp;apos;s a flavour of of Weinberg&amp;apos;s diagram of
  effects or causal loop diagrams but I like how this visualises things like
  ripples in a pond, moving outwards from a centre.
&lt;/div&gt;
&lt;p&gt;
  One of the challenges in designing anything that will exist in the world is
  anticipating the impacts, particularly given that the world is a complex
  system and the impacts are indirect and subject to feedback mechanisms. I like
  this diagram as a potential tool for exposing some of that visually.
&lt;/p&gt;
&lt;p&gt;
  Reviewing the other participants&amp;apos; work I was struck by how easy it is to fall
  into the trap of not
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2023/04/storming-risk-storming.html&quot;&gt;describing the impact&lt;/a&gt;. I&amp;apos;ve done it myself here: &amp;quot;more accidents&amp;quot; (an impact) and &amp;quot;policing costs&amp;quot;
  (not an impact, as stated, but an area that will be impacted). I see this all
  the time when we do exercises such as risk storming at work. Describing the
  impact means being explicit about the mechanism, it&amp;apos;s another deeper layer of
  analysis.
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 4&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day4.html&quot;&gt;Task&lt;/a&gt;: Draw a
  Rich Picture, exploring all that happens &amp;quot;behind the scenes&amp;quot; when you fill a
  kettle or pot with water. 
&lt;/div&gt;
&lt;h3 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/AVvXsEhpFPuRYZIgYIi5nM7iEdZWQS3T3J_slrV8o4jyfdebyiYMoKcuYkvGN8Gu16gajt_sjV8gOW3MJcYUkcqoqnk541g7WBf4qfw5e49SgxaP8mCbxqtq-nMbGNLWKu310YhZ-QP1CAFJmPhtzHZE1PgkSHSmK1SsVsFkvMVXqr1ptsgR3ys3n1QpKyxToU07/s2384/Day4.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;288&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1710&quot; data-original-width=&quot;2384&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpFPuRYZIgYIi5nM7iEdZWQS3T3J_slrV8o4jyfdebyiYMoKcuYkvGN8Gu16gajt_sjV8gOW3MJcYUkcqoqnk541g7WBf4qfw5e49SgxaP8mCbxqtq-nMbGNLWKu310YhZ-QP1CAFJmPhtzHZE1PgkSHSmK1SsVsFkvMVXqr1ptsgR3ys3n1QpKyxToU07/w400-h288/Day4.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  Patrick Prill
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/posts/patrick-prill_adventofsystemseeing-activity-7402409852024729601-FG2g/&quot;&gt;said &lt;/a&gt;everything I&amp;apos;d want to say about this one but I&amp;apos;d add links to
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2021/08/fail-here-or-fail-there.html&quot;&gt;Fail Here or Fail There&lt;/a&gt;,
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2014/09/read-it-and-weep.html&quot;&gt;Read it and Weep&lt;/a&gt;,
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2016/08/fail-over.html&quot;&gt;Fail Over&lt;/a&gt;.
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left&quot;&gt;Day 5&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.ruthmalan.com/Advent/2025/Day5.html&quot;&gt;Task&lt;/a&gt;: Gather
  some of the thoughts that have been percolating around systems as the
  introductory page to a zine on 5x3 index cards. 
&lt;/div&gt;
&lt;h3 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/AVvXsEiOBz5TmwUOe6WPgSyhDb9EjKf_fdN4f5l_sDrRNKM44m6rhwCZ8hu_IMtHhNhSSkSFXQ7vQmXoUpbZMdq-byGsj3N-qFy438yh4q-huR04v4CfcygHsUhNpCjMdoQWpAYyJQYlDM1pHLfOHqIpv_xNAnWqi64TtrbZrMtHgGQpHch9fBQNbtFMvdjqheVJ/s1796/Day5_zine1.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;258&quot; style=&quot;border: 0px solid black&quot; data-original-height=&quot;1158&quot; data-original-width=&quot;1796&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOBz5TmwUOe6WPgSyhDb9EjKf_fdN4f5l_sDrRNKM44m6rhwCZ8hu_IMtHhNhSSkSFXQ7vQmXoUpbZMdq-byGsj3N-qFy438yh4q-huR04v4CfcygHsUhNpCjMdoQWpAYyJQYlDM1pHLfOHqIpv_xNAnWqi64TtrbZrMtHgGQpHch9fBQNbtFMvdjqheVJ/w400-h258/Day5_zine1.jpg&quot;&gt;&lt;/a&gt;
&lt;/h3&gt;
&lt;div style=&quot;text-align: left&quot;&gt;
  In contrast to the other exercises so far, I took a few minutes to think about
  how I wanted to lay out a 5&amp;quot;x3&amp;quot; card. I quickly decided that the key thing I
  want to get across about systems is that it&amp;apos;s easy to forget that you&amp;apos;re
  looking at one. 
&lt;/div&gt;
&lt;p&gt;
  I drew the hard-to-read central panel to try to make that point and then tried
  to list things that are relevant to getting a model of a system on either
  side. I didn&amp;apos;t intend to categorise them as &amp;quot;to consider&amp;quot; and &amp;quot;to look for&amp;quot;
  before I started. I am still not sure they are good labels, but I kind of feel
  that the list on the left are things that could perhaps be considered in the
  abstract and on the right things that require looking at the system. &lt;i&gt;Very &lt;/i&gt;roughly.&lt;br&gt;&lt;br&gt;Next: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://qahiccupps.blogspot.com/2026/08/see-it-days-6-9.html&quot;&gt;Days 6-9&lt;/a&gt;&lt;br&gt;&lt;span style=&quot;font-size: xx-small&quot;&gt;Image: Inspired by Explore It! by Elisabeth Hendrickson. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://pragprog.com/titles/ehxta/explore-it/&quot;&gt;Pragmatic Press&lt;/a&gt;&lt;/span&gt;&lt;/p&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></feed>