<?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>4690104288019</gr:continuation><updated>2026-09-06T15:47:42Z</updated><entry gr:crawl-timestamp-msec="1788703279211"><id gr:original-id="https://www.thegreenreport.blog/?t=1788705116">tag:google.com,2005:reader/item/00000861000000a7</id><category term="typescript"></category><category term="playwright"></category><category term="nodejs"></category><category term="ui"></category><category term="performance"></category><category term="reporting"></category><title type="html">Lock the Resource, Not the Suite: Parallel Playwright Tests That Share State</title><published>2026-09-06T14:01:19Z</published><updated>2026-09-06T14:01:19Z</updated><link rel="alternate" href="https://www.thegreenreport.blog/articles/lock-the-resource-not-the-suite-parallel-playwright-tests-that-share-state/lock-the-resource-not-the-suite-parallel-playwright-tests-that-share-state.html" type="text/html"></link><summary type="html">Playwright gives you parallel execution for free, right up until two tests reach for the same thing at the same time. One seeded admin account, one feature flag, one...</summary><author><name></name></author><source gr:stream-id="feed/https://www.thegreenreport.blog/resources/xml/feeds.xml"><id>tag:google.com,2005:reader/feed/https://www.thegreenreport.blog/resources/xml/feeds.xml</id><title type="html">The Green Report | Quality Assurance Blog</title><link rel="alternate" href="https://www.thegreenreport.blog/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788673471000"><id gr:original-id="https://medium.com/p/463465f03d2b">tag:google.com,2005:reader/item/00000cb30000000d</id><category term="kubernetes"></category><category term="performance-testing"></category><category term="software-testing"></category><category term="software-development"></category><category term="platform-engineering"></category><title type="html">Do you, too, let your customers test your app’s performance?</title><published>2026-09-06T05:44:31Z</published><updated>2026-09-06T05:44:31Z</updated><link rel="alternate" href="https://medium.com/@stearz/do-you-too-let-your-customers-test-your-apps-performance-463465f03d2b?source=rss-95df8f367297------2" type="text/html"></link><summary type="html">&lt;p&gt;Performance testing has an image problem. It is often treated as something only done by large companies, huge platforms and systems with absurd amounts of traffic. Amazon needs it, maybe Netflix too. But your own product? Surely it is still way too small for that, right?&lt;/p&gt;&lt;p&gt;The reasoning often sounds sensible: If your application ever becomes popular enough for performance to be a problem, you will probably be making enough money to deal with it then.&lt;/p&gt;&lt;p&gt;There is just one problem with that calculation: Most companies have no idea when that point will arrive.&lt;/p&gt;&lt;figure&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; alt src=&quot;https://cdn-images-1.medium.com/max/1024/1*84nq_ICreZaJVpYc0q676A@2x.jpeg&quot;&gt;&lt;figcaption&gt;Photo by &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.jpvalery.photo/&quot;&gt;Jp Valery&lt;/a&gt; on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://unsplash.com/&quot;&gt;Unsplash&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Many teams can not tell you how many requests their application is able to handle. Quite often, they do not even know how many requests a typical user generates while doing something completely ordinary. Still, everyone assumes that there is plenty of room left.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;„We will deal with it later“ is not a technical assessment in that case but hope.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;Performance problems do not start at Amazon scale&lt;/h3&gt;&lt;p&gt;An application does not need millions of users to run into trouble. A handful of expensive requests arriving at the same time may be enough. A database query might be perfectly fast under normal conditions but scale badly. An external service might become the bottleneck. A single user action might trigger far more internal work than anyone expected.&lt;/p&gt;&lt;p&gt;Kubernetes resource requests and limits are another good example. In many teams they are educated guesses at best. Someone chose a few values, the application started, and everyone moved on.&lt;/p&gt;&lt;p&gt;Do those values fit the actual workload? Most teams do not know.&lt;/p&gt;&lt;p&gt;I am not saying that every team should immediately start a huge performance testing project. I am saying that company size tells you very little about whether performance testing is useful.&lt;/p&gt;&lt;h3&gt;Performance testing is not free&lt;/h3&gt;&lt;p&gt;It would be dishonest to present performance tests as a small addition to the existing test suite.&lt;/p&gt;&lt;p&gt;A serious performance testing project can be expensive and time-consuming. The developers understand the application. The platform team understands the infrastructure. Other teams may operate the databases, networks or external dependencies. You also need monitoring, a reproducible test environment and some idea of what realistic traffic looks like.&lt;/p&gt;&lt;p&gt;That knowledge rarely sits with one person or even one team.&lt;/p&gt;&lt;p&gt;And let us be honest: &lt;strong&gt;Almost nobody is waiting for a development team to stop delivering features for two sprints because they would like to build performance tests.&lt;/strong&gt; Product development is nearly always under pressure. New features are visible, an outage that never happened is not.&lt;/p&gt;&lt;p&gt;That organisational reality does not disappear just because performance matters.&lt;/p&gt;&lt;p&gt;But neither does the other side of the argument: &lt;strong&gt;If you do not test the application yourself, your customers will test it for you.&lt;/strong&gt; And your on-call colleagues will have to clean up the mess.&lt;/p&gt;&lt;h3&gt;How much testing is enough?&lt;/h3&gt;&lt;p&gt;There is no universal answer. It depends on the company, the product and the damage an outage can cause.&lt;/p&gt;&lt;p&gt;An internal tool only used occasionally by ten people needs a different level of protection than a public booking system being tha backbone of your company‘s turnover. A slow response may be annoying. A complete outage during an important business process may mean lost revenue, manual recovery work or people being unable to do their jobs.&lt;/p&gt;&lt;p&gt;I think two questions are a useful place to start:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;What would one day of downtime cost us?&lt;/li&gt;&lt;li&gt;How well do we actually know our application?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The first question is not only about revenue. Support work, frustrated customers, manual cleanup and the strain on the people carrying the pager all count.&lt;/p&gt;&lt;p&gt;The second question is more uncomfortable. Does the team know where the application’s limits are? Which endpoints are expensive? Which dependency fails first? Are CPU and memory really the bottlenecks? What happens when traffic rises suddenly instead of gradually?&lt;/p&gt;&lt;p&gt;If the honest answer to most of those questions is „we do not know“, that is already a good reason to run a first test.&lt;/p&gt;&lt;h3&gt;You are allowed to start small&lt;/h3&gt;&lt;p&gt;Performance testing does not have to begin with a perfect test environment and a complete simulation of every possible user journey.&lt;/p&gt;&lt;p&gt;A small k6 load test against one important action can already show how the application behaves as traffic increases. Do not only look at response times. Watch the error rate, CPU, memory, database connections and the services your application depends on.&lt;/p&gt;&lt;p&gt;This is not a complete performance testing programme. It is simply a first look at your application under conditions that rarely occur during normal development.&lt;/p&gt;&lt;p&gt;Once you have that, you can ask better questions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Is there an obvious bottleneck?&lt;/li&gt;&lt;li&gt;Do the resource requests and limits make sense?&lt;/li&gt;&lt;li&gt;Does the application fail in a controlled way, or does one problem trigger another?&lt;/li&gt;&lt;li&gt;Are occasional manual tests enough?&lt;/li&gt;&lt;li&gt;Would a small test in the delivery pipeline be useful?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Maybe the first test shows that the application has plenty of headroom. That is a perfectly good result. &lt;strong&gt;The important part is that the decision is now based on something you observed instead of a gut feeling.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;Make the risk a conscious decision&lt;/h3&gt;&lt;p&gt;Not every team needs the same kind of performance tests. Some applications justify dedicated environments and complex scenarios. For others, a small recurring test of the most important paths is enough.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The team should decide consciously which performance risk it is willing to carry.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you know roughly where your application’s limits are, you can weigh cost against risk. If you do not know, you have already made that decision without noticing.&lt;/p&gt;&lt;p&gt;The performance test will still happen eventually. In production. Run by your customers. And probably at a time when nobody wanted to be testing anything.&lt;/p&gt;&lt;p&gt;In case you want to start doing performance testing take a look at my &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@stearz/performance-testing-kubernetes-workloads-144b2d8e4fb5&quot;&gt;other article&lt;/a&gt; describing my experiences doing it so you don’t have to do the same mistakes I did. If you want you can also watch this &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/-KQbWUZ_VoM?is=5k48vk1oHlb9FD7q&quot;&gt;interview I gave on YouTube&lt;/a&gt; if that is more your thing.&lt;/p&gt;&lt;p&gt;What about you? Are you doing performance tests? What is your experience? Write in the comments if you like.&lt;/p&gt;</summary><author><name>Stephan Schwarz</name></author><source gr:stream-id="feed/https://medium.com/feed/@stearz"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@stearz</id><title type="html">Stories by Stephan Schwarz on Medium</title><link rel="alternate" href="https://medium.com/@stearz?source=rss-95df8f367297------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788652800000"><id gr:original-id="https://qualitywithmillan.github.io/blog/i-removed-the-right-document-day-13">tag:google.com,2005:reader/item/000008500000005d</id><category term="blog"></category><category term="engineering"></category><category term="ai"></category><category term="evals"></category><category term="llm-as-a-judge"></category><category term="llm-evals"></category><title type="html">I removed the right document - day 13</title><published>2026-09-06T00:00:00Z</published><updated>2026-09-06T00:00:00Z</updated><link rel="alternate" href="https://qualitywithmillan.github.io/blog/i-removed-the-right-document-day-13.html" type="text/html"></link><summary type="html">&lt;p&gt;
 Written by -

    
    
    
        &lt;strong&gt;Millan Kaul&lt;/strong&gt;
    

&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I removed one document from my RAG test. The model still sounded completely sure.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
  &lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://qualitywithmillan.github.io/assets/images/2026/09/evals_day_13.png&quot; alt=&quot;Image shwoing Debugging RAG quality&quot;&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;Sometimes the model is not the problem. Retrieval is.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;article-p4skdLO0L8NTSajr9cpZD0GbTQM-what-i-did-today&quot;&gt;What I did today:&lt;/h3&gt;
&lt;p&gt;I asked the same question with and without the relevant source document in the retrieved context. Then I compared whether the assistant admitted uncertainty or invented an answer.&lt;/p&gt;

&lt;h3 id=&quot;article-p4skdLO0L8NTSajr9cpZD0GbTQM-what-surprised-me&quot;&gt;What surprised me:&lt;/h3&gt;
&lt;p&gt;The biggest issue was not generation quality. It was that retrieval failed silently.&lt;/p&gt;

&lt;h3 id=&quot;article-p4skdLO0L8NTSajr9cpZD0GbTQM-my-qa-takeaway&quot;&gt;My QA takeaway:&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Test retrieval and generation separately, or you will debug the wrong layer.&lt;/li&gt;
  &lt;li&gt;Sometimes the model is not the problem. Retrieval is.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do your RAG tests tell you whether the right context was retrieved?&lt;/p&gt;

&lt;p&gt;#RAG #AIEvals #TestAutomation&lt;/p&gt;</summary><author><name>Millan Kaul</name></author><source gr:stream-id="feed/https://qualitywithmillan.github.io/feed.xml"><id>tag:google.com,2005:reader/feed/https://qualitywithmillan.github.io/feed.xml</id><title type="html">Quality With Millan</title><link rel="alternate" href="https://qualitywithmillan.github.io/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788645600000"><id gr:original-id="https://scrolltest.com/?p=7790">tag:google.com,2005:reader/item/0000044400000317</id><category term="AI Testing"></category><category term="Testing"></category><title type="html">Building an Agentic Testing Pipeline: AI That Plans, Executes, and Triages Tests</title><published>2026-09-05T22:00:00Z</published><updated>2026-09-05T22:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/agentic-testing-pipeline-ai-plans-executes-triages/" type="text/html"></link><summary type="html">&lt;p&gt;AI agents that autonomously prioritize, execute, analyze tests. Self-healing locators, auto-triage, bug filing. Python pipeline.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/agentic-testing-pipeline-ai-plans-executes-triages/&quot;&gt;Building an Agentic Testing Pipeline: AI That Plans, Executes, and Triages Tests&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788628972165"><id gr:original-id="tag:blogger.com,1999:blog-909564683308195950.post-856575559625523085">tag:google.com,2005:reader/item/0000057000000064</id><category term="conferences"></category><category term="ctf"></category><category term="growing"></category><category term="learning"></category><category term="security"></category><category term="socrates"></category><title type="html">SoCraTes 2026 - Managing Energy</title><published>2026-09-05T17:22:52Z</published><updated>2026-09-05T17:22:52Z</updated><link rel="alternate" href="https://www.lisihocke.com/2026/09/socrates-2026-managing-energy.html" type="text/html"></link><summary type="html">&lt;p&gt;
  It&amp;apos;s been my fifth time at
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.socrates-conference.de/&quot;&gt;SoCraTes Germany&lt;/a&gt;
  this year. It felt like diving into a familiar place where I can experience a
  proper timeout from everything for a few days, and soak up one variation of
  how &amp;quot;good&amp;quot; can look like. By far not perfect or without potential for
  improvement, but truly good. Being there the fifth time, with my communities from
  various conferences and tech areas overlapping more and more, also meant that I
  met a lot of wonderful people again that I just enjoy spending time
  with, be it in deep conversations, sharing our passions, or spending our time
  on the silliest fun activities. The great thing about SoCraTes is that the organizers intentionally craft the space, so I won&amp;apos;t only meet people who I&amp;apos;ve grown
  close to, but every year I&amp;apos;m getting to know lots of amazing people I haven&amp;apos;t
  met before. I truly enjoy making new connections. The sad thing is, that I
  will never be able to do any of my connections justice in how I choose to
  spend time with them. I&amp;apos;m grateful nonetheless for all of you.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Arrival Day &lt;/h2&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  This year was truly exhausting so far. Which meant that I couldn&amp;apos;t start into
  SoCraTes well rested with my energy levels fully charged - they were rather in
  the lower parts already. Not a great idea in hindsight, but hey, you have what
  you have and you choose how to work with that. The travel day went well, I had plenty of time catching up with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ma-schmi/&quot;&gt;Martin Schmidt&lt;/a&gt; during the train ride, and enjoyed meeting a few first people when
  arriving at the venue.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  The evening was calm, with great conversations at our dinner table about
  organizing conferences,
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://opensecurityconference.org/&quot;&gt;the conference I co-organize&lt;/a&gt;, company culture and what it means for people wanting to go to
  conferences. Yep, there was a pattern for sure! The evening went longer,
  topics changed, I could catch up with a few people and then it was time to
  rest in preparation for the next day.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt; &lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Training Day&lt;/h2&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  This year,
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/juke/&quot;&gt;Juke Trabold&lt;/a&gt; was the facilitator for the conference. I was truly happy to see them
  again in this role, as for me, Juke is one of the most skilled, considerate,
  thoughtful and kind persons, facilitators and moderators I know of. They set
  the space for all of us from the start in a manner that resonated throughout
  the event.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  During the opening, I met
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/daniel-steinhauer-791242116/&quot;&gt;Daniel Steinhauer&lt;/a&gt;
  in person again, a former colleague, dear friend and conference co-organizer
  fellow. It&amp;apos;s been his first SoCraTes and I&amp;apos;m still super happy he trusted my
  (and other folks&amp;apos;) recommendation to experience it for himself.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  The
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.socrates-conference.de/training/&quot;&gt;training day&lt;/a&gt;
  offered less sessions than the last years, and it was still hard for
  people to make a choice. For me the decision was fortunately straightforward, so one thing less I needed to spend energy on.
  Another change was that the first training was twice as long as the second
  slot, an interesting experiment. It worked out for me this year.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  For the first session, it was instantly clear to me that I would join
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/gitteklitgaard/&quot;&gt;Gitte Klitgaard&lt;/a&gt;&amp;apos;s training &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.socrates-conference.de/training/#gitte-klitgaard&quot;&gt;Psychological Safety Awareness&lt;/a&gt;&amp;quot; as soon as I read she&amp;apos;s going to give a session. I&amp;apos;ve had the honor to
  witness her talks and workshops in the past and speak with her personally many
  times. Every time I&amp;apos;m going to Gitte&amp;apos;s workshops I&amp;apos;m gaining new insights
  about the topic and myself. Even when doing a workshop I&amp;apos;ve been to already in
  the past, like this one. It&amp;apos;s worth it every single time. Invaluable. This
  training was once again bringing different aspects to my attention. Gems like:
  &amp;quot;If you are not failing, it&amp;apos;s either not challenging enough or you&amp;apos;re not safe
  enough.&amp;quot; or &amp;quot;You can&amp;apos;t just follow a guideline to create a safe environment as
  it&amp;apos;s about the fear we have inside.&amp;quot; Also on the facilitation of the session
  itself, like &amp;quot;Ask people to pass explicitly so they used their voice on the
  room, so it&amp;apos;s easier to use it again.&amp;quot; or &amp;quot;One reason I sit down here is not
  to be the teacher, you&amp;apos;re not reporting to me.&amp;quot; I also made new realizations
  about myself - which doesn&amp;apos;t often happen in training settings. With Gitte,
  they just show up. She&amp;apos;s setting the space in a way that allows that to happen
  for me. Anyways, I cannot share much deeper insights here as the training rule rightfully was
  that nothing leaves the room. I can say, however, that I really appreciate my
  fellow training participants for sharing so openly with each other, giving
  each other the room to do so as well, and practicing listening to each other.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  For the second training I chose
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/dianamontalion/&quot;&gt;Diana Montalion&lt;/a&gt;&amp;apos;s &amp;quot;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.socrates-conference.de/training/#diana-montalion&quot;&gt;From Feature Factory To Forge&lt;/a&gt;&amp;quot;. I only witnessed Diana on stage before and was curious how her energy would show
  up in a hands-on session. It did show a lot and I loved it! Perfect for this
  late afternoon session. Also, I was pleasantly surprised to see
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/sofia-katsaouni-96111113b/&quot;&gt;Sofia Katsaouni&lt;/a&gt; co-facilitating the session, adding another angle on the topic and
  leading by example with her human skills. What both of them offered us was a
  fun group exercise in multiple evolutionary steps. We had to design a movie
  review themed system. Decide what are the core concepts for it. Have another
  group provide us definitions for those concepts without interaction, so there
  were plenty of surprises to deal with! We defined our core capabilities. We
  had the system challenged by people from other groups. We could evolve it
  further in short time. Our group even checked if the domain name we had in
  mind was still available! A key phrase that stuck with me was &amp;quot;Agreement on
  words is not the same as agreement on meaning.&amp;quot; Oh my, we&amp;apos;ve all been through
  that. Besides that, I really enjoyed Diana&amp;apos;s references to improv theater (I
  really like the &amp;quot;yes, and&amp;quot; to build on each others&amp;apos; ideas). A fun surprise was
  the mention of &amp;quot;No Vehicles In The Park&amp;quot;, a super fun exercise I had the
  pleasure to have
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ezagroba/&quot;&gt;Elizabeth Zagroba&lt;/a&gt; facilitate. Best thing: She was at the conference as well and obviously
  now had to run this session there, too! I heard people loved it just as
  much as I did a few years back. She&amp;apos;s the best in doing these sessions - not
  only these sessions, obviously, yet they are a true highlight. If you ever have the
  opportunity, join and witness your brain be tied up in knots (in the best way
  possible)!
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  After the training sessions, I met plenty of folks again and then settled for
  a calm dinner with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ezagroba/&quot;&gt;Elizabeth Zagroba&lt;/a&gt; and
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/joepschuurkes/&quot;&gt;Joep Schuurkes&lt;/a&gt; to catch up a bit with each other. Then it was time for wold café
  already, where we ran three rounds of finding a random table, sitting down
  with a bunch of people, and connecting with each other over a few guided
  questions. Always a nice start to the main part of the conference and I&amp;apos;m
  usually getting to know new people this way! Just like this time as well. The
  evening went on, I dove into a deep and long conversation to catch up with
  Gitte, and suddenly it was again time to go to bed.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt; &lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Open Space Day 1&lt;/h2&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  Juke introduced everyone to the concept of an open space, then the first
  marketplace of ideas opened. SoCraTes Germany is the largest open space
  conference I know of, and this year they probably had a new record with way
  over 200 people joining. It can really be daunting to pitch a raw idea in front
  of such a big crowd, let alone wait for this pitch while standing in the very
  long queue, trying to listen to the current presenter. I&amp;apos;m truly glad this
  wasn&amp;apos;t my first time speaking at conferences, and not my first time at
  SoCraTes. I&amp;apos;m always in awe how many new people and also youngsters dare to do
  so! That&amp;apos;s one of the very special parts of this conference. It&amp;apos;s scary, and at the same time many people feel safe to do it nonetheless.&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  As usual at open space conferences, I make myself a plan which sessions I want
  to go to - and then things happen differently. Just like this time, when
  during the first session slot I met
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/susanne-neunes-a7b614191/&quot;&gt;Susanne Neunes&lt;/a&gt;
  in the hallway and we basically opened our own session, talking about the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://opensecurityconference.org/&quot;&gt;Open Security Conference&lt;/a&gt;, organizing, ideas, and a lot more. 
&lt;/p&gt;
&lt;ul style=&quot;text-align: left&quot;&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;Threat Modeling&amp;quot; by &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ma-schmi/&quot;&gt;Martin Schmidt&lt;/a&gt;. I knew Martin had revised his talk and wanted to do either a dry run or have a
    conversation about the topic. I was curious to hear the talk, learn how he
    presents the topic to the audience, and what worked for them. It was great
    to see people interested in this, the following conversation and
    knowledge exchange was great as well. A core message: &amp;quot;Just start. Better do
    something than do nothing.&amp;quot; I can&amp;apos;t agree more!
  &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;All time favorite computer games&amp;quot; by me. At open space conferences, plenty
    of people host sessions on all kinds of passions, hobbies and more. I had never proposed a session on a non-tech topic before, yet this
    year I thought, why not? The year was so stressful and I should focus on
    some pure fun topics anyways. So I pitched it as a lunch session and was
    pleasantly surprised seeing lots of folks already at the table, eager to
    share their most favorite games. And we did! You could literally see the people&amp;apos;s eyes light up when talking about their highlights. Together, we
    came up with a really nice list of amazing games to enjoy. This didn&amp;apos;t only
    give energy in the moment, it was a great idea in hindsight as it grew
    beyond the event. We now have a SoCraTes games channel on Discord and even our own
    private Steam group (many thanks to
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/franksons/&quot;&gt;Frank Sons&lt;/a&gt;
    for making all of this happen!). Super cool to see what comes out of a
    simple idea.
  &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;Supply chain security&amp;quot; by
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/bertramvogel/&quot;&gt;Bertram Vogel&lt;/a&gt;. I really appreciate people bringing security topics and raising awareness
    on certain risks. In this case, Bertram shared the specific supply chain
    risks for Node and npm. There&amp;apos;s been plenty of examples in the last years
    for sure. He advocated for good options to offer further layers of defense to
    protect ourselves, while acknowledging that we always need more. I left the
    session a tad early to prepare for my own upcoming session, yet overall I
    felt he reached people to look into this topic further which is great for
    all of us.
  &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;&amp;quot;Capture the Flag Together (Beginners&amp;apos; Edition)&amp;quot; by me. Well, I know, it&amp;apos;s
    not the first session I do to introduce people to security testing and
    witnessing how people can find and exploit vulnerabilities to see or do what
    they are not supposed to. And yet, these sessions are usually good fun. Seems there&amp;apos;s
    also always people coming! This time again, I had a huge room, difficult to
    moderate yet it seems it went okay enough. Sadly, I already noticed during the session I was lacking energy to help steer this group in a better way. At least some folks did come back
    for more in the evenings. &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;OpSec&amp;quot; by Eric. This session sounded really interesting as it was focused on
    personal security which I really wanted to learn more about. But then I had
    to realize that my energy levels were super low, my brain too tired to focus
    on the session. So I had to leave early and found myself in the coffee corner just
    chatting a bit before the evening closing of the first set of sessions. Good
    time to write some kudos cards as well! Before I experienced this way of appreciating and recognizing someone else, I never
    understood the concept of physical kudos cards. Now I&amp;apos;m their biggest fan.
    There&amp;apos;s just something special about receiving a written thank you, and even
    better: giving it to someone else and seeing their face light up.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  Dinner time! This evening, I tried to catch up with as many dear community
  friends as possible, and it worked. Like with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/tdpauw/&quot;&gt;Thierry de Pauw&lt;/a&gt; and their two kids, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/marckalmes/&quot;&gt;Marc Kalmes&lt;/a&gt;. I had a fabulous time at table 19 and I had the impression it worked out for the
  others just as well. 
&lt;/p&gt;
&lt;p&gt;
  Well. And then I continued my self-imposed, now well-established tradition to host an evening session: &amp;quot;Capture
  the Flag Together (Adventurer&amp;apos;s Edition)&amp;quot;. This time, I even had it start late
  to make more time to talk with people beforehand. And still, once again, so
  many people showed up, curious to explore and learn together. It was a really
  nice session, while it was also a very frustrating session as we didn&amp;apos;t get
  the flag yet. When we realized it was late in the night already we agreed to tackle this
  again the next evening with a fresh perspective. 
&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Open Space Day 2&lt;/h2&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
  While the day before I had already realized I&amp;apos;m lacking energy, this day I
  couldn&amp;apos;t deny it anymore. Usually, I manage to get myself out of bed for the
  second marketplace, even if just barely. This time I just couldn&amp;apos;t. Good thing
  is I wanted to be easy on myself anyway and not propose a session during the
  day but rather join more from others. And then it happened again, the first
  time slot I ended up in an impromptu hallway track session. I just talked with
  folks and enjoying my time while allowing myself to start the day slower.
&lt;/p&gt;
&lt;ul style=&quot;text-align: left&quot;&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;Security card game&amp;quot; by
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/philipp-zug-a892161b/&quot;&gt;Philipp Zug&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ma-schmi/&quot;&gt;Martin Schmidt&lt;/a&gt; and me. Oh right, didn&amp;apos;t I say no session for me today? Well, no
    session to pitch today, as Philipp was so kind to take this over for us. And
    yet, of course I wanted to join our little group that bonded together a few
    years ago at
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.lisihocke.com/2023/09/socrates-2023-a-place-where-i-belong.html&quot;&gt;SoCraTes 2023&lt;/a&gt;
    and started building a &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/Security-Card-Game/securityDeckGame&quot;&gt;security-themed game&lt;/a&gt; as a little relaxed side project. Every year
    since we hosted a playtest session at SoCraTes, so obviously we were eager
    to see how people interacted with the game in its current state. It didn&amp;apos;t evolve as much as
    we planned to since last year, and yet there were some significant
    improvements. This time, it showed! For the very first time, people in the
    room really played the game as is. They chose a scenario to play. They went
    slowly, card by card, making thoughtful decisions together. They introduced
    a group voting. They pondered back and forth about potential outcomes of
    their decisions. It was such a joy to observe! Also, this group had
    wonderful feedback once again that will help us in the coming year to
    improve the game further. Definitely an energy-giving session.&lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;&amp;quot;Photography&amp;quot; by Camille de Pauw. I love art. Especially visual art.
    Whenever I interact with art, it makes me connect with a part of myself that I
    don&amp;apos;t often have the capacity to connect to and it re-energizes me. This
    session was just beautiful. Camille dared to showcase favorite pieces of a
    photography project she worked on, with the theme of feminism, capturing women resting in themselves and showcasing strength in doing what they&amp;apos;re doing. Camille prepared
    the room in a way that when you entered the session, you instantly dove
    into a different world. Not the conference session you&amp;apos;d expect! Suddenly you&amp;apos;re confronted and engaging with her pieces, alongside many
    others who do the same in their own way. Some people just looked intensely
    at the photos. Others discussed their origin and making. Some found details
    others missed. Some evaluated what they liked and what they would change. It
    was just beautiful. I admire Camille&amp;apos;s courage to do this. For me, my heart
    and soul was full after this session and I really wouldn&amp;apos;t have missed
    it. &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;How to delete stuff&amp;quot; by &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ezagroba/&quot;&gt;Elizabeth Zagroba&lt;/a&gt;. So many people joined to exchange their experiences on a very crucial
    topic that is far from easy but all of us face sooner or later: the topic on how to get rid
    of software. Features, services, you name it. Decommissioning and sunsetting
    things is hard. Deleting even lines of codes can be hard for people (personally, I
    usually really enjoy this). I loved how this session truly engaged people,
    how they listened to each other sharing advice and hardships, how we all
    took note on ideas that might help us delete more stuff that most definitely
    should be deleted. A few gems I took with me were &amp;quot;Get people moving, just
    moving alone helps&amp;quot;, and the idea of ADRs as &amp;quot;Any decision record&amp;quot; to take
    away the pressure, make it everyone&amp;apos;s job, be clear it doesn&amp;apos;t have to
    be perfect and lower barrier. Ingenious.
  &lt;/li&gt;
  &lt;li style=&quot;text-align: left&quot;&gt;
    &amp;quot;Cat Hicks&amp;apos; &amp;apos;Psychology of software teams&amp;apos;&amp;quot; by
    &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/simongoertzen/&quot;&gt;Simon Görtzen&lt;/a&gt;. I&amp;apos;ve been following &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/drcathicks/&quot;&gt;Cat Hicks&lt;/a&gt; for a while on social media and was inspired by many takes from her
    researcher point of view on software team dynamics. As soon as I heard she
    wrote a book, I had to get it. Well, I truly lack capacity this year and I
    have not read her book yet. Even better that Simon did and gave a session to
    review the core points as well as comment them with what parts resonated with him. Really
    insightful session that strengthened my resolution to read this book. A
    core topic here was the message to recognize &amp;quot;culture and psychological
    safety as core infrastructure of a learning organization&amp;quot;. Hear, hear.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  The open space was nearly over by now. We did a retrospective, gave further kudos
  cards, thanked the hotel staff and childcare folks. With that, the open space
  was officially closed by Juke. That didn&amp;apos;t mean we couldn&amp;apos;t propose evening
  sessions and also longer workshop slots for the next day. And even promote
  partner conferences, like, who would have guessed, the
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://opensecurityconference.org/&quot;&gt;Open Security Conference&lt;/a&gt;
  that has its origin at
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.lisihocke.com/2023/09/socrates-2023-a-place-where-i-belong.html&quot;&gt;SoCraTes 2023&lt;/a&gt;
  as well. Super cool to have four organizers represented at SoCraTes this year.&lt;/p&gt;
&lt;p&gt;
  Dinner time, conversation time, play time. Finally I had a chance to catch up
  a bit with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/janina-nemec-39875316a/&quot;&gt;Janina Nemec&lt;/a&gt; and play our traditional round of &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://en.wikipedia.org/wiki/Set_(card_game)&quot;&gt;SET&lt;/a&gt; together. Time flew by and - guess what? - another round of &amp;quot;Capture the
  Flag Together (Eventually)&amp;quot; started. We continued on the same machine as the day
  before and hurray, we found the flag! It was fun and we all learned a bunch
  with this as well. The evening (shall I say night?) closed for me with yet
  another tradition: long nighttime walks together with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/w3ltraumpirat/&quot;&gt;Tobias Goeschel&lt;/a&gt;, talking about - well, everything. It&amp;apos;s an honor, a pleasure, and not taken
  for granted we can do this, at least once a year.
&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Workshop Day&lt;/h2&gt;
&lt;p&gt;
  Last day of the conference, reserved for longer hands-on interactive sessions.
  I&amp;apos;ve joined a few of them in the last years, I&amp;apos;ve given my own workshops, or just gave myself more time to connect with folks. All of that has value. This time I tried again something new. &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ma-schmi/&quot;&gt;Martin Schmidt&lt;/a&gt; and I had considered to propose a threat modeling workshop to
  conferences next year, so what better opportunity to try ourselves at
  SoCraTes to introduce people to the topic and give them first-hand experience?
  It really helped we had talked about the topic multiple times this year
  already. It also helped I had just been at his talk during the open space. For the workshop day, we had briefly aligned on what
  we intended to do. Yet the final concept? Due to so many
  things going on, we created it only half an hour before the workshop. Usually,
  that would be my horror scenario. Yet as we know each other well, we managed
  to quickly draft out the structure and exercises and we were indeed ready to
  go, and calm on top. Super grateful for Martin&amp;apos;s trust! Both of us were happy to see all the people who showed up, we had way more participants than
  expected. We ran the workshop and we saw people were really engaged. They
  didn&amp;apos;t only have fun, they also had insightful discussions and feedback in the
  end. I can&amp;apos;t reveal too much here, yet it seems this workshop idea is truly taking shape for
  next year. Lots of things went well, we have some tangible improvements, the
  proof of concept provides value. What a cool insight to take with us.
&lt;/p&gt;
&lt;p&gt;As we had just spent a lot of energy it was great that the afternoon was calm and I had some time to catch up with things before we
  headed for dinner. At dinner, how else could it be, people schemed plans
  for the evening. Lightning talks, conference session summaries, board games. I
  shared I&amp;apos;d offer another round of Capture the Flag Together as that&amp;apos;s my kind of fun - and people
  instantly signed up for it. So this happened once again! Truth be told, I shouldn&amp;apos;t have done it the way I did, as my energy levels were way too low and I
  didn&amp;apos;t manage to facilitate and moderate the room in a way I should have when
  hosting a session. Lesson learned for the next time.&lt;/p&gt;
&lt;p&gt;
  In the late evening, there were surprisingly few people left. We grouped
  together and had a really relaxed end of the day. One of my highlights
  were to playtest a puzzle game - details not to be revealed yet, I&amp;apos;ll leave that to
  the authors! It was super fun, it had everything I need from such a game. A
  nice way to discover the rules. Just the right level of difficulty, not too
  easy and difficult enough it&amp;apos;s doable but an achievement to solve the puzzle.
  And a perfectly weird theme you can be playful with. Special shoutout to
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/claudia-bischoff/&quot;&gt;Claudia Bischoff&lt;/a&gt; for fully diving into this together with me!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 style=&quot;text-align: left&quot;&gt;Departure Day &lt;/h2&gt;
&lt;p&gt;
  This late night session would have been the perfect ending. But of course it
  wasn&amp;apos;t, there was still the journey home and that starts with whoever has to
  leave the venue at the same time. For me it was a perfect opportunity to catch
  up with
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/jana-fuerchtenicht/&quot;&gt;Jana Fuerchtenicht&lt;/a&gt; on the first leg of the train ride. Thank you so much for keeping my
  spirits up while my energy levels were crashing, I really appreciate it!
&lt;/p&gt;
&lt;p&gt;
  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.linkedin.com/in/ma-schmi/&quot;&gt;Martin Schmidt&lt;/a&gt; and I continued on and chatted for a while until I was on my own. I
  arrived home and I realized I was completely exhausted. While some of the
  sessions refilled my batteries, a lot of other happenings had drained me. I
  had definitely overexerted myself, this time worse than ever as I had already
  come to the event with a clear deficit. Another reminder that I need to manage
  my energy levels way more actively than I did this time. Don&amp;apos;t get me wrong: this conference is
  absolutely worth being at and investing energy in. At this event, people care - not only for themselves, but
  also for each other. Some situations will give a lot of energy, some will
  drain a lot of energy (and be still invaluable). Sometimes we manage to find a
  balance, sometimes we don&amp;apos;t. This time, I just clearly didn&amp;apos;t. A stark reminder for
  myself and I&amp;apos;m glad I had it. Sometimes we need those reminders to change the
  way we do things. During the coming year and also at SoCraTes 2027 - I hope to be back!&lt;/p&gt;&lt;p&gt;
&lt;iframe width=&quot;400&quot; height=&quot;150&quot; style=&quot;border: 0&quot; src=&quot;https://mastodon.social/@lisihocke/117190951711505355/embed&quot; allow=&quot;autoplay; fullscreen; encrypted-media; clipboard-write; picture-in-picture; web-share&quot; sandbox=&quot;allow-same-origin allow-scripts allow-forms allow-popups allow-presentation&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt; &lt;br&gt;&lt;iframe width=&quot;400&quot; height=&quot;150&quot; style=&quot;border: 0&quot; src=&quot;https://mastodon.social/@lisihocke/117190951792373518/embed&quot; allow=&quot;autoplay; fullscreen; encrypted-media; clipboard-write; picture-in-picture; web-share&quot; sandbox=&quot;allow-same-origin allow-scripts allow-forms allow-popups allow-presentation&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</summary><author><name>Lisi Hocke</name></author><source gr:stream-id="feed/https://www.lisihocke.com/feeds/posts/default"><id>tag:google.com,2005:reader/feed/https://www.lisihocke.com/feeds/posts/default</id><title type="html">A Tester&apos;s Journey</title><link rel="alternate" href="https://www.lisihocke.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788579000000"><id gr:original-id="https://scrolltest.com/?p=10205">tag:google.com,2005:reader/item/0000044400000316</id><category term="Javascript"></category><category term="Testing"></category><title type="html">Day 7: JavaScript Callbacks, Promises, and Async/Await for Playwright</title><published>2026-09-05T03:30:00Z</published><updated>2026-09-05T03:30:00Z</updated><link rel="alternate" href="https://scrolltest.com/js-playwright-framework-day-07-callbacks-promises-async-await/" type="text/html"></link><summary type="html">&lt;p&gt;Playwright is a Promise library wearing a browser. Today we take the classroom callback, Promise, and async/await labs from LearningPlaywrightBatch and turn them into the waits, APIRequestContext calls, and retry loops you actually write.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/js-playwright-framework-day-07-callbacks-promises-async-await/&quot;&gt;Day 7: JavaScript Callbacks, Promises, and Async/Await for Playwright&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788577767224"><id gr:original-id="tag:blogger.com,1999:blog-3868566217808655382.post-3861422268229262460">tag:google.com,2005:reader/item/000002c50000047d</id><title type="html">Testing the Swagger Petstore: Reviewing API Documentation Formatted in OpenAPI 3.0 with Swagger UI</title><published>2026-09-05T03:09:27Z</published><updated>2026-09-05T03:09:27Z</updated><link rel="alternate" href="https://www.tjmaher.com/2026/09/reviewing-api-documentation-formatted.html" type="text/html"></link><summary type="html">&lt;div&gt;For this next project, we will be examining the test site &lt;b&gt;Swagger Petstore - OpenAPI 3.0&lt;/b&gt; at &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/&quot;&gt;https://petstore3.swagger.io/&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/AVvXsEg2M2GWKKLhsLyVnUj5js5tlMPuQlxud1QGOMsIcMh86EuSqk8L6j50nm_1S_bU3PraMELjUewnDt1uh7wakW5P9fBw72WDAbO7yBtS0Hr_bB12pzLfBFUdRPMgxjtD0qKtf7nWDaONZFNz7BPx2j_nRR-XAlgr9X5On0G5z3xU0qdZeqIls9J6bGnA7yM&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;306&quot; data-original-height=&quot;1392&quot; data-original-width=&quot;1824&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg2M2GWKKLhsLyVnUj5js5tlMPuQlxud1QGOMsIcMh86EuSqk8L6j50nm_1S_bU3PraMELjUewnDt1uh7wakW5P9fBw72WDAbO7yBtS0Hr_bB12pzLfBFUdRPMgxjtD0qKtf7nWDaONZFNz7BPx2j_nRR-XAlgr9X5On0G5z3xU0qdZeqIls9J6bGnA7yM=w400-h306&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/&quot;&gt;&lt;i&gt;https://petstore3.swagger.io/&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;br&gt;If we wanted to really dive deep into creating API documentation, we could use:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I&amp;apos;dRatherBeWriting&amp;apos;s Free &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/docapis_overview.html&quot;&gt;Documenting APIs course&lt;/a&gt;, showing an &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/docapis_introtoapis.html&quot;&gt;Introduction to REST APIs&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/likeadeveloper.html&quot;&gt;using APIs like a developer&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/docendpoints.html&quot;&gt;Documenting API endpoints&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/restapispecifications.html&quot;&gt;the Open API spec&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/testingdocs.html&quot;&gt;Testing API docs&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://idratherbewriting.com/learnapidoc/publishingapis.html&quot;&gt;Publishing API docs&lt;/a&gt;, and more... &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;... But that goes too deep for this blog post. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Before we begin, let&amp;apos;s get into some background information. &lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What is Swagger?&lt;/h2&gt;&lt;br&gt;According to &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://openapispec.com/docs/who-created-swagger/&quot;&gt;OpenAPISpec.com&amp;apos;s article, Who Created Swagger&lt;/a&gt;?, Swagger was created in 2010 by Tony Tam, the CTO of Wordnik, an online dictionary company that leveraged so many APIs, it was difficult for the six person engineering team to manage and scale them, writing API-clients and documentation by hand. After a 3 AM conversation, they thought... what if the API documentation could describe itself? &lt;/div&gt;&lt;span&gt;&lt;a name=&quot;article-QD3mDhfbzaxKOvs5GQM2100xTrc-more&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;There already was WADL, the XML-based Web Application Description Language. The name was coined after a joke they made, &amp;quot;Why WADL when you can Swagger?&amp;quot;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Swagger went from being an internal fix for a company became to an open-source project other companies relied on.&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;Swagger was acquired by &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://smartbear.com/&quot;&gt;SmartBear Software&lt;/a&gt; in 2015 from the renamed Wordnik, Reverb Technologies. According to OpenAPISpec&amp;apos;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://openapispec.com/docs/what/what-is-the-history-of-the-smartbear-swagger-acquisition/&quot;&gt;What Is the History of the SmartBear Swagger Acquisition&lt;/a&gt; Tony Tam also joined SmartBear as the VP of Products. Smartbear donated the Swagger Specification to a new group, the OpenAPI Initiative, sponsored by the Linux Foundation. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I love SmartBear! They have hosted my old software testing Meetup, the now defunct Ministry of Testing - Boston &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tjmaher.com/search?q=smartbear&quot;&gt;many, many times&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Since then:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt; &amp;quot;&lt;b&gt;OpenAPI&lt;/b&gt;&amp;quot; is the OpenAPI Specification &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/OAI/OpenAPI-Specification&quot;&gt;as seen on GitHub&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;b&gt;Swagger&lt;/b&gt;&amp;quot; is SmartBear&amp;apos;s toolset such as &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/open-source/swagger-ui/&quot;&gt;Swagger UI&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://editor.swagger.io/&quot;&gt;Swagger Editor&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/open-source/swagger-codegen/&quot;&gt;Swagger Codegen&lt;/a&gt;, and SwaggerHub (soon to be Swagger Studio).  &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;OpenAPI Initiative: Bridging Systems and Subcultures: A Swagger Origin Story&lt;/b&gt;&lt;div&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_G9dlv66-xw?si=Ps2nu-uhTpO28IQx&amp;amp;autoplay=0&amp;amp;fs=1&amp;amp;rel=0&amp;amp;playsinline=1&amp;amp;modestbranding=1&amp;amp;origin=https:%2f%2fbazqux.com&quot; allow=&quot;autoplay; fullscreen; encrypted-media; clipboard-write; picture-in-picture; web-share&quot; sandbox=&quot;allow-same-origin allow-scripts allow-forms allow-popups allow-presentation&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://youtu.be/_G9dlv66-xw?si=Nk0hihe7TSueXDj9&quot;&gt;&lt;i&gt;https://youtu.be/_G9dlv66-xw?si=Nk0hihe7TSueXDj9&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Where To Learn Swagger?&lt;/h2&gt;Luckily, there are many free places to learn Swagger, from both SmartBear and OpenAPI.&lt;br&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;About Swagger: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/docs/specification/v3_0/about/&quot;&gt;https://swagger.io/docs/specification/v3_0/about/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;OpenAPI 3.0 Tutorial: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://support.smartbear.com/swagger/studio/docs/en/get-started/openapi-3-0-tutorial.html&quot;&gt;https://support.smartbear.com/swagger/studio/docs/en/get-started/openapi-3-0-tutorial.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Courses at SmartBear Academ&lt;/b&gt;y: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://academy.smartbear.com/&quot;&gt;https://academy.smartbear.com/&lt;/a&gt;&lt;br&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;SwaggerHub Introductory Training&lt;/li&gt;&lt;li&gt;SwaggerHub API Designer&lt;/li&gt;&lt;li&gt;Introduction to Contract Testing&lt;/li&gt;&lt;li&gt;ReadyAPI Basics, Advanced, to learn about being an API Test Engineer&lt;/li&gt;&lt;li&gt;Intro to API Hub for Contract Testing&lt;/li&gt;&lt;/ul&gt;Linux Foundation Org:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;Training Portal: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://trainingportal.linuxfoundation.org/learn/dashboard&quot;&gt;https://trainingportal.linuxfoundation.org/learn/dashboard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;OpenAPI Fundamentals: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://training.linuxfoundation.org/express-learning/openapi-fundamentals-lfel1011/&quot;&gt;https://training.linuxfoundation.org/express-learning/openapi-fundamentals-lfel1011/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Open APIs:&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;http://learn.openapis.org/&quot;&gt;Learn.OpenAPIs.Org&lt;/a&gt;: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://learn.openapis.org/&quot;&gt;https://learn.openapis.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;OpenAPI Spec 3.0.4: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://spec.openapis.org/oas/v3.0.4.html&quot;&gt;https://spec.openapis.org/oas/v3.0.4.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;OpenAPI Videos: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.youtube.com/@OpenApi/videos&quot;&gt;https://www.youtube.com/@OpenApi/videos&lt;/a&gt;&lt;br&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;Leveraging OpenAPI to Test Your APIs&lt;/li&gt;&lt;li&gt;Accelerate Adoption of OpenAPI with Test Automation&lt;/li&gt;&lt;li&gt;Use OpenAPI Specs to Drive API Quality&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What is Swagger Petstore?&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The first version of the Swagger Petstore was a sample server app produced by Tony Tam and his engineering team when Wordnik first introduced Swagger, so others could check out Swagger&amp;apos;s capabilities. It&amp;apos;s not a real server.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;This third version is now hosted by Smartbear, and is updated to Open API 3.0. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The page, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/&quot;&gt;https://petstore3.swagger.io/&lt;/a&gt; is generated on-the-fly with Swagger UI, from the YAML file, &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/api/v3/openapi.yaml&quot;&gt;https://petstore3.swagger.io/api/v3/openapi.yaml&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;Swagger Petstore Repo&lt;/b&gt;: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://github.com/swagger-api/swagger-petstore/tree/master&quot;&gt;https://github.com/swagger-api/swagger-petstore/tree/master&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What is Swagger UI?&lt;/h2&gt;&lt;div&gt;Swagger UI is a web application that reads an OpenAPI definition and renders interactive API documentation.&lt;br&gt;&lt;br&gt;Swagger UI was developed as an open-source web application that could render a Swagger or OpenAPI specification into a human-readable way to examine an API, eliminating the need for developers and testers to manually read raw JSON or YAML API definitions.&lt;br&gt;&lt;br&gt;Swagger UI allows users to browse API operations, inspect request and response schemas, authenticate against secured APIs, and execute live API calls directly from a browser. &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;A few features of Swagger UI:&lt;/div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;Auto-Generated Documentation:&lt;/b&gt; Swagger UI reads your API schema file and dynamically creates a clean, organized webpage. It groups endpoints, shows paths, and lists response codes without requiring manual HTML coding.&lt;/li&gt;&lt;li&gt;&amp;quot;&lt;b&gt;Try It Out&amp;quot;&lt;/b&gt;: Users can enter parameters, headers, and request bodies directly into the browser to execute live API calls against a real or mocked server and see the exact response in real-time.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Clear Schema Models&lt;/b&gt;: It details the required data structures, object types, and validation constraints for every request and response, serving as an interactive contract for developers.&lt;/li&gt;&lt;li&gt;&lt;b&gt;No Dependencies&lt;/b&gt;: It is a client-side asset (built with HTML, JavaScript, and CSS) that runs entirely inside any modern web browser without needing a backend server or a database.&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;The Components of Swagger UI&lt;/h2&gt;&lt;br&gt;You can use the Swagger UI to explore APIs in JSON or YAML format. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The OpenAPI document we are exploring is &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/api/v3/openapi.json&quot;&gt;https://petstore3.swagger.io/api/v3/openapi.json&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div style=&quot;clear: both&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjf2Jg3XEjYzOwIYJZt4IsGflZmXogmo1Id8rrwYRZshCKlDtYjy-HLVkthucYikZMiy1R0Pae6ZKEPk_VHQ_Z0QD3Plek3liIJXkRCwLL-bTs_oUJtgIEFlExR6DWSGzTjMsIFr93VhpvoXvwpuxMA4O_RvuCE6XDEF9fDL6t9ckfczchAuSdyGYD7Xr8&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;43&quot; data-original-height=&quot;124&quot; data-original-width=&quot;1168&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjf2Jg3XEjYzOwIYJZt4IsGflZmXogmo1Id8rrwYRZshCKlDtYjy-HLVkthucYikZMiy1R0Pae6ZKEPk_VHQ_Z0QD3Plek3liIJXkRCwLL-bTs_oUJtgIEFlExR6DWSGzTjMsIFr93VhpvoXvwpuxMA4O_RvuCE6XDEF9fDL6t9ckfczchAuSdyGYD7Xr8=w400-h43&quot;&gt;&lt;/a&gt;&lt;/div&gt;If you open that URL directly in a browser, you won&amp;apos;t see the formatted page. You&amp;apos;ll see raw YAML file describing every endpoint, parameter, and data model. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The &amp;quot;Explore&amp;quot; button just tells Swagger UI to fetch and render whatever spec URL is typed into that box, which is handy if you&amp;apos;re pointing the same Swagger UI instance at a different API&amp;apos;s spec file. &lt;br&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/AVvXsEjmTWVn_q2xygeI2qbhSt_2aH7smYJOWkIJSq8-8kS76pgixPARckzrBYe6ZOCYutHaFwlKapIZ4tLRNlY4n-O0CTEfX56z9t27oRWwZVhY03Z9quE-AvkuvxctrjsQ0L8z1QSRtMEtc9_OxDya0fvxkfN43IndsxyV12by9ZY4ieeOys3DBz1QoyVdrTg&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;43&quot; alt data-original-height=&quot;93&quot; data-original-width=&quot;693&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjmTWVn_q2xygeI2qbhSt_2aH7smYJOWkIJSq8-8kS76pgixPARckzrBYe6ZOCYutHaFwlKapIZ4tLRNlY4n-O0CTEfX56z9t27oRWwZVhY03Z9quE-AvkuvxctrjsQ0L8z1QSRtMEtc9_OxDya0fvxkfN43IndsxyV12by9ZY4ieeOys3DBz1QoyVdrTg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;To the right of the name, the grey badge shows you the version of the API, and the green badge shows you which version of the OpenAPI Specification conforms to [&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/docs/open-source-tools/swagger-ui/usage/version-detection/&quot;&gt;Swagger UI Doc / version detection&lt;/a&gt;]. &lt;/li&gt;&lt;li&gt;Need to review the actual spec? It is provided in the link below the title. &lt;/li&gt;&lt;/ul&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/AVvXsEgEHpjuCzQHYcCHyiQIl8URsL98qGIpeNGue37-bpiMi4gJNOW8JJLqj_anrN92-pCqyCRKmDnsKNfG7dtp3zVOHmUKu_XO9BaNtjZVTua9HBslgxiJE4XadhKjI_K6NMScSWV4wiiL6hdMHbj0QBWp-6gM7tk7EAWwJbF8c0TASy43I4aqvFbo7WWT6So&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;50&quot; data-original-height=&quot;79&quot; data-original-width=&quot;1004&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgEHpjuCzQHYcCHyiQIl8URsL98qGIpeNGue37-bpiMi4gJNOW8JJLqj_anrN92-pCqyCRKmDnsKNfG7dtp3zVOHmUKu_XO9BaNtjZVTua9HBslgxiJE4XadhKjI_K6NMScSWV4wiiL6hdMHbj0QBWp-6gM7tk7EAWwJbF8c0TASy43I4aqvFbo7WWT6So=w640-h50&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;OpenAPI 3.0 spec includes a servers array that defines the base URL an array can be reached at. Every endpoint path, such as &amp;quot;/pet&amp;quot;, will get appended to it... so /pet + /api/3 resolves to  &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://petstore3.swagger.io/api/v3/pet&quot;&gt;https://petstore3.swagger.io/api/v3/pet&lt;/a&gt; [ &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/docs/specification/v3_0/api-host-and-base-path/&quot;&gt;Swagger UI Doc / API Server and Base Path&lt;/a&gt; ]&lt;/li&gt;&lt;li&gt;Servers can point to, say, a dev server, a staging server, and a production server. &lt;/li&gt;&lt;li&gt;The Authorize button with the lock relates to the authentication scheme, such as an API Key, OAuth2, etc. Clicking on it lets you supply credentials so that &amp;quot;Try it Out&amp;quot; requests you send from the page contains them. &lt;/li&gt;&lt;/ul&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/AVvXsEgzKw8yz1oHu4L4wEAcx0G0spvnQaIzQDecB_r6SogcGC9KnVoIFfotpDcDLvwYL8lRqezZGOLTD3rlUgzRwA_iO-_MpwhP5r9Dtdphid9qrtgocK9t3D_ji9I_P-2ktrfDKiIBG45z4LoYXW-mOUQ1ecd3IyHmLlEDRrO0jqjEem7mSYRUgygcAvzviTY&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;210&quot; height=&quot;240&quot; alt data-original-height=&quot;543&quot; data-original-width=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgzKw8yz1oHu4L4wEAcx0G0spvnQaIzQDecB_r6SogcGC9KnVoIFfotpDcDLvwYL8lRqezZGOLTD3rlUgzRwA_iO-_MpwhP5r9Dtdphid9qrtgocK9t3D_ji9I_P-2ktrfDKiIBG45z4LoYXW-mOUQ1ecd3IyHmLlEDRrO0jqjEem7mSYRUgygcAvzviTY&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;Below the Servers and Authorize button, you can see three groupings: &lt;b&gt;pet&lt;/b&gt;, &lt;b&gt;store&lt;/b&gt;, and &lt;b&gt;user&lt;/b&gt;.&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; 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/a/AVvXsEhqgh0sNNTu-Q9GggYzc2YTwbX76yOtySTYpACLg1yZ68hPv_SoIMShv0tGZMUL-0q92w8Hcvh7F4UUQNrZGJNjPD8ppgXgwukL8qWJVTQV2OzqmAuWhlJRGEv2n9YqFe8xdL7kDfehH0OPliL6pAaxUBDjInAv8dU_sQbw-0FwHKLshW1rthr6ozA8Gls&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;109&quot; data-original-height=&quot;207&quot; data-original-width=&quot;763&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhqgh0sNNTu-Q9GggYzc2YTwbX76yOtySTYpACLg1yZ68hPv_SoIMShv0tGZMUL-0q92w8Hcvh7F4UUQNrZGJNjPD8ppgXgwukL8qWJVTQV2OzqmAuWhlJRGEv2n9YqFe8xdL7kDfehH0OPliL6pAaxUBDjInAv8dU_sQbw-0FwHKLshW1rthr6ozA8Gls=w400-h109&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;In the OpenAPI spec, they are called &lt;b&gt;tags&lt;/b&gt;. [ &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/docs/specification/v3_0/grouping-operations-with-tags/&quot;&gt;Swagger 3.0 / Grouping Operations With Tags&lt;/a&gt; ]&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;These tags are set up by the API developer designing this OpenAPI Yaml or JSON spec to group up common endpoints. If you expand pet, for example, you can see that it shows how you can interact with the /pet endpoint, such as with the HTTP Methods such as PUT, POST, GET and DELETE. &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/a/AVvXsEgVKnb8QFrWdDzcGTHMCfgVeHTIqAFfALXNZVSkJW6TqI5AOU0jvKVLnbEb7pc9X3XL1ak71M0qXfY7NTF7p5_A-nHubLA3Mi9gEtPNrspvru39TIo0tV0JYfgkPntO3UNuCjUQFEZsUHwnFBIvTO0JQ06LCDnQPfuuIdUWc8GMOzjKDM8QoRe2_NpJqmE&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;162&quot; alt data-original-height=&quot;506&quot; data-original-width=&quot;1002&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgVKnb8QFrWdDzcGTHMCfgVeHTIqAFfALXNZVSkJW6TqI5AOU0jvKVLnbEb7pc9X3XL1ak71M0qXfY7NTF7p5_A-nHubLA3Mi9gEtPNrspvru39TIo0tV0JYfgkPntO3UNuCjUQFEZsUHwnFBIvTO0JQ06LCDnQPfuuIdUWc8GMOzjKDM8QoRe2_NpJqmE&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;GET retrieves data. It does not create, change, or delete anything on the server. In the Petstore, GET /pet/{petId} fetches one pet&amp;apos;s details without touching it.&lt;/li&gt;&lt;li&gt;POST creates something new, or submits data for processing. In the Petstore, POST /pet creates a brand new pet entry.&lt;/li&gt;&lt;li&gt;PUT  replaces an existing resource entirely with the data you send. In the Petstore, PUT /pet updates an existing pet. You send the pet&amp;apos;s full data, including its ID, not just the one field that changed.&lt;/li&gt;&lt;li&gt;DELETE removes a resource. In the Petstore, DELETE /pet/{petId} removes one specific pet by ID.The bottom section on the Swagger UI is the Schema section. Everything above the schema describes operations: what you can do, at which path, and with which method in the API. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The schema describes data, the reusable objects the operations pass around. In OpenAPI spec, they live in a components.schema field. [ See &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://swagger.io/docs/specification/v3_0/basic-structure/&quot;&gt;Swagger Docs / Spec / Basic Structure&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/AVvXsEhMtsXlsfvK3Rnf-PK90zk7qqApu-DWU5S-Z3rDSJfYBwieLjlz_4mjK69crj_uJszZE_MwiYGDXDyPF1n2So8oYnXcOXD7APNXOxs4rsNz6ULnD9dWlGUN6lewOW3p96n6Rt6ZJPf7TnnpDSQJxtGTAd0g1_eF8x8hIitz15SjkWkiSCY6vef30mkDBgc&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;345&quot; data-original-height=&quot;564&quot; data-original-width=&quot;654&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhMtsXlsfvK3Rnf-PK90zk7qqApu-DWU5S-Z3rDSJfYBwieLjlz_4mjK69crj_uJszZE_MwiYGDXDyPF1n2So8oYnXcOXD7APNXOxs4rsNz6ULnD9dWlGUN6lewOW3p96n6Rt6ZJPf7TnnpDSQJxtGTAd0g1_eF8x8hIitz15SjkWkiSCY6vef30mkDBgc=w400-h345&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;The six models listed here are the core data types the Petstore is built around: &lt;br&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;b&gt;Order&lt;/b&gt;: the format of a store order (what you&amp;apos;d get back from the store tag&amp;apos;s order operations). &lt;/li&gt;&lt;li&gt;&lt;b&gt;Category&lt;/b&gt;: a pet&amp;apos;s category, like &amp;quot;Dogs,&amp;quot; which you actually saw nested inside the pet JSON examples in earlier screenshots. &lt;/li&gt;&lt;li&gt;&lt;b&gt;User&lt;/b&gt;: a user account record. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Tag&lt;/b&gt;: not the same thing as the pet/store/user grouping tags from earlier; this is a data model representing a label attached to a pet (also visible nested inside the pet JSON examples). &lt;/li&gt;&lt;li&gt;&lt;b&gt;Pet&lt;/b&gt;: the main object type, the full shape of a pet record: ID, name, category, photo URLs, tags, status. &lt;/li&gt;&lt;li&gt;&lt;b&gt;ApiResponse&lt;/b&gt;:  a generic response wrapper, commonly used for operations like uploadImage that return a simple status/message rather than a full resource.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Each of these schemas can be expanded to show the model&amp;apos;s actual fields, data types, and if they are required. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Here, the schema can be defined once, with GET / PUT / POST, etc calls all getting the format of what a &amp;quot;Pet&amp;quot; actually is from this. New field? An API developer can just add it here. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;What Is The Pet Schema? &lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If you expand the PET schema, you can see that it contains the fields, data types, and gives some examples of proper data you can submit:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;id: integer. Example: 10&lt;/li&gt;&lt;li&gt;name (required): string. Example: &amp;quot;doggie&amp;quot;.&lt;/li&gt;&lt;li&gt;category: id (integer) and name (string). Example: &amp;quot;1. Dogs&amp;quot; &lt;/li&gt;&lt;li&gt;photoUrls(required): name: photoUrl: wrapped: tru&lt;/li&gt;&lt;li&gt;tags: &lt;/li&gt;&lt;li&gt;status: &amp;quot;pet status in the store&amp;quot;. Enum: available, pending, sold&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;When Photourls and tags are xml wrapped: true, it means the XML will use a parent element wrapper to encase all the items in the list, rather than just repeating the elements consecutively.&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrls&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrl&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;string&amp;lt;/&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrl&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrl&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;string&amp;lt;/&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrl&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(147, 52, 230);&quot; style=&quot;border-bottom: 0px rgb(147, 52, 230); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;photoUrls&lt;/span&gt;&lt;span aria-owns=&quot;action-menu-parent-container&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; style=&quot;border-bottom: 0px rgb(10, 10, 10); font-family: monospace; font-size: 14px; margin: 0px&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Examining the PUT /pet endpoint&lt;/h2&gt;The HTTP PUT request method updates and changes the parameters of an existing pet. POST creates a brand new one. GET retrieves the pet object. DELETE deletes them. And you can do that all through this Swagger UI.  &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;Each of the methods, such as the PUT /pet endpoint, can be expanded, so you can see and tinker with the APIs parametets. &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/AVvXsEhWVZSaU1R4nUA6aPYUo_l_NrrzA5j8WOc_O4w2VVWyqis2a42-DLZF7js3LzFJGirE9i-nMnfapizgzSeAopSyduh05yC0r9caoIb_j6uWCHzLaZZp-iqKLgPh9xMtyov0M1d0n_mMI0tcG_ZJY79VrtipArAPNNedYjK3aIf0SgRoIrh0GeM4DBaD3IM&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;610&quot; data-original-height=&quot;1129&quot; data-original-width=&quot;1186&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhWVZSaU1R4nUA6aPYUo_l_NrrzA5j8WOc_O4w2VVWyqis2a42-DLZF7js3LzFJGirE9i-nMnfapizgzSeAopSyduh05yC0r9caoIb_j6uWCHzLaZZp-iqKLgPh9xMtyov0M1d0n_mMI0tcG_ZJY79VrtipArAPNNedYjK3aIf0SgRoIrh0GeM4DBaD3IM=w640-h610&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;The &lt;b&gt;Request Body dropdown&lt;/b&gt; can show examples such as &lt;b&gt;application/json&lt;/b&gt;:&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code class=&quot;language-json&quot; style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;doggie&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;category&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: {
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;Dogs&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;  },
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;photoUrls&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: [
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;  ],
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: [
&lt;/span&gt;    {
&lt;span style=&quot;box-sizing: inherit&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;    }
  ],
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;available&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;... Application/xml...&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit; color: #fc9b9b&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;pet&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;doggie&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;Dogs&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrls&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrl&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrl&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrls&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;available&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;pet&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;... Or even application/x-www.form-urlencoded:&lt;/div&gt;&lt;blockquote&gt;Update an existent pet in the store&lt;br&gt;id&lt;br&gt;integer($int64)&lt;br&gt;&lt;br&gt;name *&lt;br&gt;string&lt;br&gt;&lt;br&gt;category&lt;br&gt;object&lt;br&gt;&lt;br&gt;photoUrls *&lt;br&gt;array&amp;lt;string&amp;gt;&lt;br&gt;&lt;br&gt;tags&lt;br&gt;array&amp;lt;object&amp;gt;&lt;br&gt;&lt;br&gt;status&lt;br&gt;string&lt;/blockquote&gt;The &lt;b&gt;Responses dropdown&lt;/b&gt; can show what a successful response would look like, after creating a new pet in the API with either application/json format: &lt;br&gt; &lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code class=&quot;language-json&quot; style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;doggie&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;category&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: {
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;Dogs&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;  },
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;photoUrls&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: [
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;  ],
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: [
&lt;/span&gt;    {
&lt;span style=&quot;box-sizing: inherit&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;      &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;    }
  ],
&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;available&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;... or application/xml format...&lt;div&gt;&lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit; color: #fc9b9b&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;pet&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;doggie&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;Dogs&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrls&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrl&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrl&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;photoUrls&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;available&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;pet&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #62c8f3&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br&gt;It also shows error codes such as:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left&quot;&gt;&lt;li&gt;400 Invalid ID supplied&lt;/li&gt;&lt;li&gt;404 Pet not found&lt;/li&gt;&lt;li&gt;422 Valid exception&lt;/li&gt;&lt;li&gt;default Unexpected error. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;422 is a new one to me. This means it is an Unprocessable Entity... the request was correctly formatted, but the data itself failed validation rules once the server tried to process the call. Like, say for example the status of a pet could only be &amp;quot;available&amp;quot;, &amp;quot;pending&amp;quot; or &amp;quot;sold&amp;quot;, and you put in &amp;quot;cuddly&amp;quot;, it should throw a 422. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;default is thrown when we do not explicitly catch an error. Example: If it is a 500 Internal Server Error, or a 401 Unauthorized, it displays that response, and not any of the special statuses we have put aside.&lt;/div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Examining the POST /user endpoint&lt;/h2&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Let&amp;apos;s examine the POST Method for the /user endpoint, which creates a user if we are logged into the system.&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/AVvXsEi1BtubkIzMnEznFJElO89gGmy93ttYhZ3fBjDhoUwcbPW9kJjOUoatOdeu4a3DMSXAjeNDtUDuRdWxWCKQBqiRE6CqtfFtORt-2YwYWkMn9FYiiAAa_VO3fG4uxZN5-RSZJcV7GH9Elk9MhcKLKZh_x350qcwsF8cOsaQX_8HjoGbVTw1Y4qWPUHRT7Go&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;522&quot; data-original-height=&quot;1098&quot; data-original-width=&quot;1347&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEi1BtubkIzMnEznFJElO89gGmy93ttYhZ3fBjDhoUwcbPW9kJjOUoatOdeu4a3DMSXAjeNDtUDuRdWxWCKQBqiRE6CqtfFtORt-2YwYWkMn9FYiiAAa_VO3fG4uxZN5-RSZJcV7GH9Elk9MhcKLKZh_x350qcwsF8cOsaQX_8HjoGbVTw1Y4qWPUHRT7Go=w640-h522&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Here, also, we can sent information to the server, attempting to POST it like so:&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code class=&quot;language-json&quot; style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;theUser&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;firstName&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;lastName&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;James&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;&lt;a href=&quot;mailto:john@email.com&quot;&gt;john@email.com&lt;/a&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;phone&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;userStatus&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;If we see that it is successful, we will see a 200 Response.&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background: rgb(51, 51, 51); border-radius: 4px; box-sizing: border-box; color: white; font-size: 12px; font-weight: 600; hyphens: auto; margin: 0px; overflow-wrap: break-word; overflow: auto; padding: 0.5em; white-space: pre-wrap; word-break: break-word&quot;&gt;&lt;code class=&quot;language-json&quot; style=&quot;box-sizing: border-box; font-family: Consolas, monaco, monospace; font-size: 1em; white-space: pre; word-break: break-all&quot;&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;theUser&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;firstName&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;lastName&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;James&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;&lt;a href=&quot;mailto:john@email.com&quot;&gt;john@email.com&lt;/a&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;phone&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #a2fca2&quot;&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;,
&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;&amp;quot;userStatus&amp;quot;&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;box-sizing: inherit; color: #d36363&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;box-sizing: inherit&quot;&gt;
&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If not, we will get nothing fancy, just a default, Unexpected error. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style=&quot;text-align: left&quot;&gt;Examining the GET /user/login endpoint&lt;/h2&gt;&lt;div&gt;After a user is created, the GET /user/login endpoint logs you into the system. &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/AVvXsEgjd6mSltSDNHrWdW6o42x54Zq8NN71XYdOHaaBFear8ZNYO5SWuCJjfFCBfk-Exn2veqToPSmAr2NenZiOtv28V4GFET-KiYUePa2SVY1IezPqrBSr-_ZSrPLnzUjTfzLyjL8JEgpTOUCfpKhsiqcW_xM387Yb0vKgkpO_wxn9rDJREUjbH1Sai0esZY8&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;486&quot; data-original-height=&quot;1015&quot; data-original-width=&quot;1337&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgjd6mSltSDNHrWdW6o42x54Zq8NN71XYdOHaaBFear8ZNYO5SWuCJjfFCBfk-Exn2veqToPSmAr2NenZiOtv28V4GFET-KiYUePa2SVY1IezPqrBSr-_ZSrPLnzUjTfzLyjL8JEgpTOUCfpKhsiqcW_xM387Yb0vKgkpO_wxn9rDJREUjbH1Sai0esZY8=w640-h486&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Enter the username and password of a user, and you can log into the system. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Next, we will be looking how to manually test this API using this Swagger UI. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&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="1788571800000"><id gr:original-id="tag:blogger.com,1999:blog-4863939272631764935.post-2349021485549520366">tag:google.com,2005:reader/item/000006660000004f</id><category term="Charting The Course Book"></category><category term="Testing Books"></category><title type="html">Reading: Charting the Course by Rob Sabourin — Chapter 2: &amp;quot;Some Philosophy&amp;quot;</title><published>2026-09-05T01:30:00Z</published><updated>2026-09-05T01:30:00Z</updated><link rel="alternate" href="https://testingeduindia.blogspot.com/2026/09/reading-charting-course-by-rob-sabourin.html" type="text/html"></link><summary type="html">&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;While reading Chapter 2, one fundamental question really stopped me: &lt;b data-index-in-node=&quot;82&quot; data-path-to-node=&quot;0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&amp;quot;How do we actually know we&amp;apos;re ready or finished in software development?&amp;quot;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;Is it when requirements are ready for design? When design is ready for development? When code goes to QA, when testing finishes, or when the product finally goes public?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;In practice, we usually try to quantify readiness using metrics like code coverage, static analysis, and predefined quality gates. But tools can only take us so far. Ultimately, the entire team needs a shared understanding of what &amp;quot;done&amp;quot; truly looks like before shipping.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;Here are my main takeaways and reflections from the chapter.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Redefining Quality with Juran&lt;/b&gt;&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Joseph Juran, a Quality Control Expert in quality management, simply defines quality as &lt;i data-index-in-node=&quot;73&quot; data-path-to-node=&quot;6&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;features that provide customer satisfaction&lt;/i&gt;. He breaks this down into the &lt;b data-index-in-node=&quot;147&quot; data-path-to-node=&quot;6&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Juran Quality Trilogy&lt;/b&gt;:&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;ul data-path-to-node=&quot;7&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 27px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Quality Planning:&lt;/b&gt; Designing for customer needs.&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Quality Control:&lt;/b&gt; Ensuring standard operations meet the target.&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Quality Improvement:&lt;/b&gt; Continually driving down defects.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&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://link.amazon/B0ebmUBmi&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;240&quot; alt data-original-height=&quot;348&quot; data-original-width=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhA-w8IQLmp-sFHCq2-SqOlHcvySgh9L2tKubjEj3QyRaf4bNcMbGB7u3pCQr9PtEBeSm-im3JpJiKSJYuJ3T6GGu10GjeQ_hS4dd8nIl5mLydXTfI-coxejseK8SfdOSXXas-QxGkmkveQhcBeYludzvCuzVBeFwLKWp-V7iZTDXvj1TG30oFyRitwxPWR&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;Link: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://link.amazon/B0ebmUBmi&quot;&gt;https://link.amazon/B0ebmUBmi&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;The Reality of Bugs &amp;amp; Regression&lt;/b&gt;&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;No matter how pristine the code is, how thorough the unit tests are, or how detailed the code reviews are done, &lt;b data-index-in-node=&quot;110&quot; data-path-to-node=&quot;10&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;regression bugs are inevitable after a change&lt;/b&gt;. That’s a reality coined by Watts Humphrey that every developer has to accept.&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;To catch these issues without testing infinite variations, Genichi Taguchi (author of the &lt;i data-index-in-node=&quot;90&quot; data-path-to-node=&quot;11&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Total Quality Handbook&lt;/i&gt;) emphasizes using smart sampling techniques for combination testing.&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;A few principles that stand out:&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;ul data-path-to-node=&quot;13&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 27px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Address them early:&lt;/b&gt; There’s no such thing as a &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot; bug—the sooner you fix it, the cheaper it is to solve.&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Priority vs. Severity:&lt;/b&gt; Severity is technical impact, but &lt;b data-index-in-node=&quot;57&quot; data-path-to-node=&quot;13,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;priority is a business decision&lt;/b&gt;. It changes based on timing, product goals, and stakeholder priorities. What was low priority last month might become critical today.&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Always report, even minor issues:&lt;/b&gt; As my mentor used to say: &lt;i data-index-in-node=&quot;60&quot; data-path-to-node=&quot;13,2,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Even if it’s a trivial bug, report it.&lt;/i&gt; Deciding whether to fix it or live with a workaround is a product decision.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br&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://link.amazon/B00WNa0Am&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;181&quot; height=&quot;240&quot; alt data-original-height=&quot;436&quot; data-original-width=&quot;329&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjlDW0XfVnN_wV0eUK6n5Qr41kpleLkWBFSLVQrj7_yHfFFv1RuLfyFGAD7q5YLv3QnkFCVZOoWY2m5m3J_7kjEt3lbN0oq2vl7_GOzmLQ5nqRaal3eQCfTKJjKmoT31AcY8Kcidt3En61EYNA4L6tS7g0YSe5KmFXrMwiV3gucBYkRyJi014-49uiFdrF9&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;Link: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://link.amazon/B00WNa0Am&quot;&gt;https://link.amazon/B00WNa0Am&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;The Bug Priority Matrix&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Much like the decision matrix from &lt;i data-index-in-node=&quot;59&quot; data-path-to-node=&quot;14&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;The 7 Habits of Highly Effective People&lt;/i&gt;, bugs are typically categorized into four quadrants:&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;ul data-path-to-node=&quot;15&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 27px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Q1:&lt;/b&gt; High Priority / High Severity &lt;i data-index-in-node=&quot;34&quot; data-path-to-node=&quot;15,0,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;(Drop everything and fix)&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Q2:&lt;/b&gt; High Priority / Low Severity &lt;i data-index-in-node=&quot;33&quot; data-path-to-node=&quot;15,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;(Minor issue, but business-critical)&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Q3:&lt;/b&gt; Low Priority / High Severity &lt;i data-index-in-node=&quot;33&quot; data-path-to-node=&quot;15,2,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;(Major technical issue, but edge case or low impact)&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,3,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Q4:&lt;/b&gt; Low Priority / Low Severity &lt;i data-index-in-node=&quot;32&quot; data-path-to-node=&quot;15,3,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;(Nice to fix eventually)&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; 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://link.amazon/B0dk2jHHu&quot; style=&quot;margin-left: 1em; margin-right: 1em&quot;&gt;&lt;img width=&quot;158&quot; height=&quot;240&quot; alt data-original-height=&quot;1500&quot; data-original-width=&quot;985&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiyIDZrgSYV6P3rfz3VqkRhoM19-ksrqdKBFHoqRD_EfUwJT4aurcscODEtGXMrYGhzLD7747EXqNwdDX9zRR_gLITCpuey33pCi8sblFDNKMU4EY2oDnDBhSxFB7b3sCa6grG3bYTheWc3dCzXH82bR1gc3h4DqrqFRs6MHQNVJpoPAFocV12wZkJndsyA&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: center&quot;&gt;Link: &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://link.amazon/B0dk2jHHu&quot;&gt;https://link.amazon/B0dk2jHHu&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;clear: both; text-align: left&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Reframing the Purpose of Testing&lt;/b&gt;&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Computer scientist Edsger W. Dijkstra famously wrote in &lt;i data-index-in-node=&quot;56&quot; data-path-to-node=&quot;18&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.cs.utexas.edu/~EWD/transcriptions/EWD02xx/EWD249/EWD249.html&quot;&gt;Notes on Structured Programming&lt;/a&gt;&lt;/i&gt;:&lt;/div&gt;&lt;br style=&quot;color: #1f1f1f; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif&quot;&gt;&lt;blockquote data-path-to-node=&quot;19&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 20px; margin-right: 40px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 12px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 8px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&amp;quot;Testing can show the presence of bugs, but never their absence.&amp;quot;&lt;/i&gt;&lt;/div&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;When Non-testers often ask, &lt;i data-index-in-node=&quot;38&quot; data-path-to-node=&quot;20&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&amp;quot;How long will it take to test this feature?&amp;quot;&lt;/i&gt; under the assumption that testing continues until the software is 100% bug-free. In reality, people aren&amp;apos;t paying for perfection—they&amp;apos;re asking how much targeted effort we need to invest across different levels to manage risk.&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; color: #1f1f1f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Text&amp;quot;, sans-serif; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;clear: both&quot;&gt;&lt;div _ngcontent-ng-c3935992595 aria-busy=&quot;false&quot; aria-live=&quot;polite&quot; dir=&quot;ltr&quot; id=&quot;article-cFC3N77C4uM8UsRCl3kPTrRuMtQ-model-response-message-contentr_efd79af1fb22bdf2&quot; inline-copy-host style=&quot;--animation-duration: 400ms; --fade-animation-function: ease-out; animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Two Practical Testing Strategies:&lt;/b&gt;&lt;/div&gt;&lt;br&gt;&lt;ol data-path-to-node=&quot;22&quot; start=&quot;1&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding-inline-start: 32px; padding: 0px 0px 0px 24px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,0,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Timeboxing Exploratory Testing:&lt;/b&gt; Give testers a fixed window of time to execute a specific test charter. If deeper testing is needed, assign a new charter. This keeps exploration structured and prioritized without spiraling into endless testing loops.&lt;/div&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;div style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 4px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px 0px 0px 4px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0&quot; style=&quot;animation: auto ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px rgb(31, 31, 31); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex-direction: row; flex: 0 1 auto; float: none; gap: normal; hyphens: manual; inset: auto; interactivity: auto; isolation: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(31, 31, 31) none 2.4px; overlay: none; padding: 0px; page: auto; perspective: none; quotes: auto; r: 0px; resize: none; rotate: none; rule: 2.4px rgb(31, 31, 31); rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1&quot;&gt;Bug Confirmation &amp;amp; Re-testing:&lt;/b&gt; Always verify fixed bugs specifically to ensure the issue is resolved and that the fix didn&amp;apos;t silently inject new regression bugs.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;clear: both&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><author><name>Srinivas Kadiyala</name></author><source gr:stream-id="feed/https://testingeduindia.blogspot.com/feeds/posts/default?alt=rss"><id>tag:google.com,2005:reader/feed/https://testingeduindia.blogspot.com/feeds/posts/default?alt=rss</id><title type="html">The Life-Long Journey of Learning!</title><link rel="alternate" href="https://testingeduindia.blogspot.com/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788566400000"><id gr:original-id="https://qualitywithmillan.github.io/blog/fluent-was-not-factual-day-12">tag:google.com,2005:reader/item/000008500000005c</id><category term="blog"></category><category term="engineering"></category><category term="ai"></category><category term="evals"></category><category term="llm-as-a-judge"></category><category term="llm-evals"></category><title type="html">Fluent was not factual - day 12</title><published>2026-09-05T00:00:00Z</published><updated>2026-09-05T00:00:00Z</updated><link rel="alternate" href="https://qualitywithmillan.github.io/blog/fluent-was-not-factual-day-12.html" type="text/html"></link><summary type="html">&lt;p&gt;
 Written by -

    
    
    
        &lt;strong&gt;Millan Kaul&lt;/strong&gt;
    

&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI gave me a polished answer today. It was also not supported by the source.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
  &lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://qualitywithmillan.github.io/assets/images/2026/09/evals_day_12.png&quot; alt=&quot;Image showing Quality vs Factuality&quot;&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;A confident answer is not automatically a grounded answer.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;article-SfEwbwJUHDYVmOEVOTtHFoS6rsk-what-i-did-today&quot;&gt;What I did today:&lt;/h3&gt;
&lt;p&gt;I gave the model a short reference document and asked a question about it. Then I checked every important claim against the actual text.&lt;/p&gt;

&lt;h3 id=&quot;article-SfEwbwJUHDYVmOEVOTtHFoS6rsk-what-surprised-me&quot;&gt;What surprised me:&lt;/h3&gt;
&lt;p&gt;The answer sounded trustworthy even when it added details the source never mentioned.&lt;/p&gt;

&lt;h3 id=&quot;article-SfEwbwJUHDYVmOEVOTtHFoS6rsk-my-qa-takeaway&quot;&gt;My QA takeaway:&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Confidence is not evidence. Grounding needs its own test.&lt;/li&gt;
  &lt;li&gt;A confident answer is not automatically a grounded answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How do you currently spot unsupported claims in AI output?&lt;/p&gt;

&lt;p&gt;#RAG #AIEvals #AIQuality&lt;/p&gt;</summary><author><name>Millan Kaul</name></author><source gr:stream-id="feed/https://qualitywithmillan.github.io/feed.xml"><id>tag:google.com,2005:reader/feed/https://qualitywithmillan.github.io/feed.xml</id><title type="html">Quality With Millan</title><link rel="alternate" href="https://qualitywithmillan.github.io/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788559200000"><id gr:original-id="https://scrolltest.com/?p=7789">tag:google.com,2005:reader/item/0000044400000315</id><category term="AI Testing"></category><category term="Testing"></category><title type="html">Prompt Testing for QA Engineers: Regression Test Your AI Prompts Like Code</title><published>2026-09-04T22:00:00Z</published><updated>2026-09-04T22:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/prompt-testing-qa-engineers-regression-test-ai-prompts/" type="text/html"></link><summary type="html">&lt;p&gt;Prompts are code. Test format compliance, topic boundaries, consistency, injection resistance. Golden dataset pattern.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/prompt-testing-qa-engineers-regression-test-ai-prompts/&quot;&gt;Prompt Testing for QA Engineers: Regression Test Your AI Prompts Like Code&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788546535000"><id gr:original-id="https://angryweasel.substack.com/p/capacity-isnt-velocity">tag:google.com,2005:reader/item/00000ad70000006f</id><title type="html">Capacity Isn’t Velocity</title><published>2026-09-04T18:28:55Z</published><updated>2026-09-04T18:28:55Z</updated><link rel="alternate" href="https://angryweasel.substack.com/p/capacity-isnt-velocity" type="text/html"></link><summary type="html">&lt;p&gt;&lt;span&gt;A few years ago (in the pre-AI world), I was in a planning meeting with a Senior Director named Dana. Dana was a good leader, a great strategist, and extremely analytical. Dana found budget for a new code-assist tool, and she was telling me how her math worked around the tool implementation and roll-out. “If the tool makes engineers even 20% faster, that was basically two extra people per team, for free.” She’d already sketched the reductions she planned to implement once the tool rolled out across her organization.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;I asked her what the team was going to do with the extra 20%. She looked at me like I’d asked a trick question. “We’ll ship more often,” she said. “That’s the whole point.”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;She never asked the team what they’d do with the extra time. I don’t think she even knew if “ship more” was a bottleneck that was causing any significant problems. She built a plan based almost entirely on what she thought efficiency could do for her org chart.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Dana’s team eventually shipped less, not more. The tool worked as expected. People absolutely wrote code faster. She didn’t recognize that writing code wasn’t, and really has never been the biggest constraint in software development. In this particular case, cutting some of the people who used to catch problems downstream just ended up moving the constraint somewhere else slower and more expensive.&lt;/span&gt;&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;p style=&quot;text-align: center&quot;&gt;In 30 years of software development, I’ve rarely seen the process of generating new code to be the bottleneck in software development. &lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;I thought about Dana a lot reading Reuters’ &lt;/span&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.reuters.com/investigations/mark-zuckerberg-had-bold-plan-replace-meta-staff-with-ai-heres-how-it-imploded-2026-08-26/&quot;&gt;&lt;span&gt;reporting on Meta’s Project OT&lt;/span&gt;&lt;/a&gt;&lt;span&gt; last week, because Meta ran pretty much the same bet at a much bigger scale, and got the same result.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;The Capacity Trap&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;Project OT was Meta’s plan that came out of a January leadership retreat to build an “AI native” company consisting of smaller, talent-dense teams of humans overseeing fleets of AI agents doing the work thousands of employees used to do. The plan included cuts of up to 60% for some teams, and assumed AI-assisted output would translate directly into headcount reductions.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;It didn’t work out as planned. Internally, code changes to Meta’s platforms rose 220% year over year, while feature changes that users could actually see rose just 36%. That gap feels big, and is important to call out. AI increased capacity, but Meta didn’t get the throughput increase it needed to justify the cuts. Capacity and throughput aren’t at all the same thing, and treating them as interchangeable cogs is where plans like this typically fall apart.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Worse, the freed-up capacity went somewhere else. Major technical and security incidents climbed 40% year over year, and time spent responding to them rose 70%. In June, that showed up publicly when hackers used Meta’s AI-powered support bot to get into high-profile Instagram accounts, including a dormant Obama-era account. As expected, the system got faster - faster at generating problems that slower-moving parts of the org then had to absorb. &lt;/span&gt;&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;p style=&quot;text-align: center&quot;&gt;AI assisted development helps teams get faster at whatever they were doing before. Creating code is rarely the constraint in the systems of software development.&lt;/p&gt;&lt;/div&gt;&lt;h2&gt;&lt;span&gt;Blame the Robots&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;A lot of what gets attributed to AI in stories like this is too-often just a correction for overhiring in 2020-2021, cosplaying as AI improvements. Zuckerberg told Reuters the cuts were partly about freeing up budget for capital expenditures, not entirely about AI replacing specific jobs. Meta’s official response walked the 60%-cut scenarios back almost as soon as Reuters asked about them: “ultimately, we didn’t move forward with every scenario from the exercise, and it was never assumed we would.”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;This isn’t the first of stories like this. Time after time, I see, “AI is replacing these roles” as a much better story to tell the market than telling the people you’re laying off, “we hired too fast during the pandemic and are now correcting for it.” &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;AI absolutely changes how much work a given team can do. That doesn’t mean every layoff attributed to it is actually caused by it.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;Speed Without System&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;What connects most directly to what I’ve written about a lot over my years of writing isn’t AI. It’s the entire system of how software is delivered. Software delivery is a system, and too many people (and companies) seem to be focusing on one part of that system vs. the overall system.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;I’ve written (and talked) before about how a lot of organizations “adopted agile” by doing waterfall in two-week chunks, with the same handoffs, the same lack of shared ownership, and the same absence of fast feedback, all compressed into shorter calendar windows and faked rituals. It may look like a transformation from the outside, but from the inside, the system that actually produces quality and velocity never changed.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Project OT did the same thing to the org chart. It swapped humans for agents inside a delivery system that was never redesigned to use either any differently. Faster code generation without a corresponding investment in other areas like integration, review, and feedback loops will produce more code that someone downstream (including the customer) has to deal with - often on a team that just got smaller. The 40% jump in incidents and the 70% jump in firefighting time aren’t a side effect of the plan. They’re what the plan actually produced. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;John Seddon has a name for this &lt;/span&gt;in &lt;em&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.taylorfrancis.com/books/mono/10.4324/9781482278446/freedom-command-control-john-seddon&quot;&gt;Freedom from Command and Control&lt;/a&gt;&lt;/em&gt;&lt;span&gt;: &lt;/span&gt;&lt;strong&gt;&lt;span&gt;failure demand&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;. Failure demand is work created by fixing things that shouldn&amp;apos;t have broken in the first place, as opposed to the value demand a system actually exists to serve. Failure demand was &lt;/span&gt;a direct output of the system that Zuckerberg and his lieutenants designed.&lt;/p&gt;&lt;h2&gt;&lt;span&gt;In Practice&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span&gt;If you’re looking at AI tooling and headcount as part of the same planning exercise, a few questions are worth asking before you change your org chart.&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;What’s the actual bottleneck right now?  Can AI help it, or does it just make the non-bottleneck steps faster? &lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;If AI frees up capacity, where does that capacity go? Think clearly about the destination before you cut the source.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;Are cuts really about AI, or is it a hiring correction that AI makes easier to explain?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;What absorbs the failure demand when the system runs faster than the parts around it can handle?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;I’m fully on-board with AI assisted coding (and have used it myself for several personal projects). My point is that we need to treat capacity as something we have to deliberately redirect, not something that automagically shows up as a shipped product. Dana’s team had the same problem Meta did, just a few orders of magnitude smaller.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;hr&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;If you’re wrestling with how to actually restructure delivery around AI tools, rather than just compress your existing process around them, I’d be glad to talk it through: &lt;/span&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://tidycal.com/19xqg4y/introductory-call-free&quot;&gt;&lt;span&gt;book a free intro call&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;clear: both&quot;&gt;&lt;/p&gt;&lt;p data-bqr-info=&quot;attachment&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2ebc101-a74f-4845-92a8-c3e12aaac950_1254x1254.png&quot;&gt;&lt;/p&gt;</summary><author><name>Alan Page</name></author><source gr:stream-id="feed/https://angryweasel.substack.com/feed"><id>tag:google.com,2005:reader/feed/https://angryweasel.substack.com/feed</id><title type="html">The Weasel Speaks</title><link rel="alternate" href="https://angryweasel.substack.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788530400000"><id gr:original-id="https://thenewstack.io/?p=22835765">tag:google.com,2005:reader/item/00000b0e000000bf</id><category term="AI Agents"></category><category term="AI Engineering"></category><category term="Software Testing"></category><category term="sponsor-oracle"></category><category term="sponsored-post-contributed"></category><title type="html">AI agent evaluations are part of the product</title><published>2026-09-04T14:00:00Z</published><updated>2026-09-04T14:00:00Z</updated><link rel="alternate" href="https://thenewstack.io/ai-agent-evaluation-gates/" type="text/html"></link><summary type="html">Move beyond simple AI demos. Build repeatable evaluation systems, test execution paths, and enforce strict release gates for AI agents.</summary><author><name>Jeremy Daly</name></author><source gr:stream-id="feed/https://thenewstack.io/software-testing/feed/"><id>tag:google.com,2005:reader/feed/https://thenewstack.io/software-testing/feed/</id><title type="html">Software Testing Archives - The New Stack</title><link rel="alternate" href="https://thenewstack.io/software-testing/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788529491000"><id gr:original-id="https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga">tag:google.com,2005:reader/item/00000a2700000069</id><title type="html">Quando Orientação a Objetos Estraga Seu Modelo de Dados</title><published>2026-09-04T13:44:51Z</published><updated>2026-09-04T13:44:51Z</updated><link rel="alternate" href="https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;O DBA foi embora e deixou a chave com você&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Em 2013, o fluxo era claro. Você recebia um documento — quase sempre um PDF com um DER exportado do Erwin — e implementava. As tabelas já existiam. Os nomes das colunas já tinham sido decididos por alguém que passou os últimos quinze anos brigando por integridade referencial. Se você quisesse um índice, abria um chamado. Se quisesse uma coluna nova, abria um chamado e esperava o comitê de mudanças da quinta-feira.&lt;/p&gt;&lt;p&gt;Aquilo era lento, burocrático e frequentemente irritante. Mas havia ali uma coisa que perdemos sem perceber: &lt;strong&gt;existia um adulto na sala cuja única função era proteger os dados de nós.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Hoje, o fluxo é outro. A squad é autônoma. Você provisiona o banco com Terraform, escolhe entre PostgreSQL e DynamoDB numa thread do Slack que dura quinze minutos, define a chave de partição no meio de um refinamento e sobe a migration junto com o PR da feature. O DBA virou SRE de plataforma, ou virou “time de dados” que cuida do lakehouse, ou simplesmente não existe mais no organograma. Ninguém revisa seu modelo. Ninguém pergunta por que aquele campo é &lt;code&gt;VARCHAR(255)&lt;/code&gt; guardando um valor monetário.&lt;/p&gt;&lt;p&gt;Nós ganhamos velocidade — muita. E ganhamos também uma responsabilidade que a maioria de nós nunca foi treinada para exercer: &lt;strong&gt;traduzir requisito de negócio em estrutura de dados&lt;/strong&gt;. Não é uma tarefa acessória do desenvolvimento. É &lt;em&gt;a&lt;/em&gt; decisão de arquitetura mais duradoura que um engenheiro toma.&lt;/p&gt;&lt;div data-callout=&quot;true&quot;&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;A assimetria que ninguém te contou&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Refatorar uma classe custa uma tarde. Trocar de framework custa um algumas semanas. Corrigir um modelo de dados errado em produção, com sete anos de histórico, integrações downstream, relatórios regulatórios e três sistemas legados lendo direto do seu banco, custa &lt;strong&gt;um programa inteiro&lt;/strong&gt; — com gerente de projeto, comitê e risco de compliance.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;É por isso que a régua da modelagem precisa ser mais alta que a régua do código. Código ruim você reescreve. &lt;/mark&gt;&lt;strong&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;Dado ruim você &lt;/mark&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;carrega&lt;/mark&gt;&lt;/strong&gt;&lt;/em&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;.&lt;/mark&gt;&lt;/p&gt;&lt;div data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://chroniclesofapragmaticprogrammer.substack.com/subscribe?&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Inscreva-se&amp;quot;,&amp;quot;language&amp;quot;:&amp;quot;pt-br&amp;quot;}&quot; data-component-name=&quot;SubscribeWidgetToDOM&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Obrigado por ler Crônicas de um Programador Pragmático! Inscreva-se gratuitamente para receber novas publicações e apoiar meu trabalho.&lt;/p&gt;&lt;/div&gt;&lt;input tabindex=&quot;-1&quot; type=&quot;email&quot; name=&quot;article-innedtk5ZlOkvyh618n6MGddJVI-email&quot; placeholder=&quot;Digite seu e-mail…&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;&lt;strong&gt;O pecado original: quando orientação a objetos vira modelagem de dados&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Antes dos princípios, precisamos falar de um viés que a nossa formação instalou e que atrapalha ativamente o raciocínio sobre dados.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;A maioria de nós aprendeu a modelar &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;objetos&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; antes de aprender a modelar &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;dados&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;.&lt;/strong&gt; E aprendeu que a classe é o ponto de partida. Então o caminho natural virou: escrevo a entidade, anoto com &lt;code&gt;@Entity&lt;/code&gt;, deixo o Hibernate gerar o DDL, e pronto — “o modelo está feito”.&lt;/p&gt;&lt;p&gt;Só que não está. O que existe ali é uma &lt;strong&gt;projeção acidental de decisões de código sobre uma estrutura de armazenamento permanente&lt;/strong&gt;. Ninguém decidiu nada sobre os dados. O schema foi um efeito colateral.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Objetos e dados são coisas diferentes&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Comece pelo &lt;strong&gt;tempo de vida&lt;/strong&gt;. Um objeto existe por milissegundos: nasce numa requisição, é serializado, morre no garbage collector. O dado que ele representa existe por décadas — vai sobreviver ao serviço que o criou, à linguagem em que foi escrito e provavelmente à empresa que o gerou na forma atual.&lt;/p&gt;&lt;p&gt;Depois, a &lt;strong&gt;identidade&lt;/strong&gt;. Objeto tem identidade por referência: dois objetos com os mesmos atributos podem ser coisas distintas, e você resolve isso sobrescrevendo &lt;code&gt;equals()&lt;/code&gt;. Dado tem identidade por chave, e essa chave precisa ser estável, única e significativa para o mundo externo — porque outros sistemas vão apontar para ela.&lt;/p&gt;&lt;p&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;Vem então a inversão mais importante, e a que quase ninguém enuncia: &lt;/mark&gt;&lt;strong&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;objeto existe para esconder estado; dado existe para expor estado&lt;/mark&gt;&lt;/strong&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;. &lt;/mark&gt;Encapsulamento é a virtude central da orientação a objetos — o mundo lá fora não deve saber como o saldo é calculado. Mas o banco de dados tem a função oposta: ele precisa ser consultável, auditável, agregável por gente que nunca vai ler o seu código. Aplicar reflexo de encapsulamento na modelagem de dados produz esquemas opacos, com campos crípticos&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; data-component-name=&quot;FootnoteAnchorToDOM&quot; id=&quot;article-innedtk5ZlOkvyh618n6MGddJVI-footnote-anchor-1&quot; href=&quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga#footnote-1&quot;&gt;1&lt;/a&gt; cujo significado só o serviço dono conhece.&lt;/p&gt;&lt;p&gt;Some a isso a &lt;strong&gt;quantidade de consumidores&lt;/strong&gt;. O seu objeto tem exatamente um consumidor: o seu código. O seu dado tem N — o time de BI, o relatório regulatório, o serviço de antifraude, o pipeline do lakehouse, o analista que vai abrir um cliente SQL às onze da noite para investigar um incidente, e o próximo time daqui a quatro anos. &lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;Modelar para um consumidor conhecido é fácil; modelar para consumidores que você nunca vai conhecer exige outro tipo de rigor.&lt;/mark&gt;&lt;/p&gt;&lt;p&gt;E, por fim, o &lt;strong&gt;critério de otimização&lt;/strong&gt;. Objeto é otimizado para comportamento: &lt;em&gt;&lt;strong&gt;coesão, baixo acoplamento, facilidade de mudança&lt;/strong&gt;&lt;/em&gt;.&lt;mark data-color=&quot;#fce5cd&quot; style=&quot;background-color: rgb(252, 229, 205); color: rgb(0, 0, 0)&quot;&gt; Dado é otimizado para verdade e para perguntas: integridade, rastreabilidade, latência de consulta&lt;/mark&gt;. São eixos diferentes — e otimizar um deles não melhora o outro por acidente.&lt;/p&gt;&lt;p&gt;O &lt;em&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://agiledata.org/essays/impedancemismatch.html&quot;&gt;object-relational impedance mismatch&lt;/a&gt;&lt;/em&gt; não é um detalhe de mapeamento. É um sintoma de que os dois mundos respondem a perguntas diferentes. Quando você deixa o modelo de objetos ditar o modelo de dados, três estragos previsíveis acontecem:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. O UPDATE destrutivo.&lt;/strong&gt;&lt;span&gt; Este é o mais caro de todos. Em OO, mutar estado é natural:&lt;/span&gt;&lt;/p&gt;&lt;div data-attrs=&quot;{&amp;quot;language&amp;quot;:&amp;quot;plaintext&amp;quot;,&amp;quot;nodeId&amp;quot;:&amp;quot;885528c2-6d0f-4846-8ac5-4963df3319a4&amp;quot;}&quot; data-component-name=&quot;HighlightedCodeBlockToDOM&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;// parece limpo. É uma bomba-relógio.
public class Conta {
    private BigDecimal saldo;

    public void debitar(BigDecimal valor) {
        this.saldo = this.saldo.subtract(valor);
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mapeado direto, isso vira &lt;code&gt;UPDATE conta SET saldo = ? WHERE id = ?&lt;/code&gt;. E aí, três meses depois, chega uma contestação de MED sobre um Pix de R$ 4.200 e alguém pergunta: &lt;em&gt;“qual era o saldo dessa conta às 14h32 do dia 12?”&lt;/em&gt;. A resposta honesta é: não sabemos. Nós sobrescrevemos.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. A herança que vaza para a tabela.&lt;/strong&gt; &lt;code&gt;SINGLE_TABLE&lt;/code&gt; produz aquela tabela com 60 colunas onde 40 são nulas dependendo da linha. &lt;code&gt;JOINED&lt;/code&gt; produz JOINs em toda leitura para servir uma hierarquia que só existe porque queríamos reaproveitar código. Herança é ferramenta de reúso de comportamento. Ela raramente descreve uma verdade do negócio.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. O modelo anêmico invertido.&lt;/strong&gt; A classe vira um saco de getters e setters, a regra vaga nos services — e como a classe não tem semântica, a tabela também não tem. Fica um &lt;code&gt;status&lt;/code&gt; genérico, um &lt;code&gt;tipo&lt;/code&gt; genérico, um &lt;code&gt;valor&lt;/code&gt; sem moeda. O domínio desaparece dos dois lados ao mesmo tempo.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;Ajuste de mentalidade&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Não é “OO é ruim”. É que &lt;strong&gt;o modelo de domínio e o modelo de persistência são dois artefatos distintos&lt;/strong&gt;, com propósitos distintos, e é saudável que eles não sejam idênticos. O objeto responde &lt;em&gt;“o que esse conceito faz?”&lt;/em&gt;. O dado responde &lt;em&gt;“o que aconteceu, e como eu provo?”&lt;/em&gt;. Quando você aceita que são perguntas diferentes, os cinco princípios abaixo deixam de ser teoria.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Os cinco princípios&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;O modelo de dados é o modelo do negócio&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Fatos são imutáveis; estado é derivado&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Modele para as perguntas, não para os dados&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Consistência tem fronteiras — e você as desenha&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Todo schema evolui; &lt;em&gt;schema-less&lt;/em&gt; é uma mentira confortável&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga?utm_source=substack&amp;amp;utm_medium=email&amp;amp;utm_content=share&amp;amp;action=share&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Compartilhar&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://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga?utm_source=substack&amp;amp;utm_medium=email&amp;amp;utm_content=share&amp;amp;action=share&quot;&gt;&lt;span&gt;Compartilhar&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;&lt;span&gt;Princípio 01: &lt;/span&gt;O modelo de dados é o modelo do negócio&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Se o pessoal de operações diz “devolução”, o jurídico diz “devolução”, o Bacen diz “devolução” — e a sua tabela chama &lt;code&gt;TB_MOV_CAD_02&lt;/code&gt; com uma flag &lt;code&gt;TP_MOV = &amp;apos;D&amp;apos;&lt;/code&gt; —, você não modelou dados. &lt;strong&gt;Você criou um dicionário paralelo que existe na cabeça de três pessoas, das quais duas já pediram demissão. 🙃&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Modelagem começa nos substantivos e verbos do domínio, não nos tipos de coluna. E isso não é preciosismo estético: nome é a interface de leitura do seu dado, e ela dura mais que qualquer API.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;Lição 1.1 &lt;/span&gt;→&lt;span&gt; &lt;/span&gt;Nome de coluna é contrato permanente, não variável local&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Renomear uma variável é Shift+F6. Renomear uma coluna em produção é: migration, dual-write, atualizar as views, avisar o time de BI, atualizar os DAGs do lakehouse, atualizar o relatório regulatório, descobrir que existe um &lt;code&gt;SELECT *&lt;/code&gt; num job COBOL de 2008 e negociar a janela de mudança.&lt;/p&gt;&lt;p&gt;Na prática, ninguém renomeia. O nome errado fica. E o pior: &lt;strong&gt;o nome errado ensina errado&lt;/strong&gt;. Todo desenvolvedor que chegar nos próximos oito anos vai aprender o domínio lendo o seu schema, e vai aprender torto.&lt;/p&gt;&lt;p&gt;Escreva o nome pensando em quem vai ler daqui a cinco anos, não em quem está digitando agora.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;Lição 1.2 &lt;/span&gt;→&lt;span&gt; &lt;/span&gt;Não ache conceitos distintos sob um nome genérico&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Este é o erro mais comum e o mais destrutivo em sistemas financeiros. A palavra “transação” parece cobrir tudo — então cria-se &lt;code&gt;tb_transacao&lt;/code&gt; com um &lt;code&gt;tipo&lt;/code&gt; e um &lt;code&gt;status&lt;/code&gt;, e enfia-se o mundo inteiro lá dentro.&lt;/p&gt;&lt;p&gt;Só que num cartão de crédito, quatro coisas absolutamente diferentes acontecem com o mesmo dinheiro:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autorização&lt;/strong&gt; — a bandeira reserva limite. Não há dinheiro se movendo. Pode expirar sozinha.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Captura&lt;/strong&gt; — o lojista confirma a venda. Agora existe uma obrigação.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Liquidação&lt;/strong&gt; — o dinheiro efetivamente troca de mãos entre instituições, em D+N.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faturamento&lt;/strong&gt; — a obrigação entra num ciclo de cobrança do portador.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Cada uma tem ciclo de vida próprio, prazo próprio, efeito contábil próprio e regra de estorno própria. Achatar as quatro em uma tabela com &lt;code&gt;status IN (&amp;apos;AUTORIZADA&amp;apos;,&amp;apos;CAPTURADA&amp;apos;,&amp;apos;LIQUIDADA&amp;apos;,&amp;apos;FATURADA&amp;apos;)&lt;/code&gt; parece elegante no dia 1 e vira um inferno no dia 400 — porque uma autorização pode ser parcialmente capturada, uma captura pode ser liquidada em duas parcelas de agenda, e o modelo não tem onde colocar isso.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Regra prática:&lt;/strong&gt; se dois “estados” de uma entidade têm ciclos de vida independentes, cardinalidade diferente entre si, ou donos diferentes no negócio — eles não são estados. São entidades diferentes.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;Lição 1.3 &lt;/span&gt;→&lt;span&gt; &lt;/span&gt;Seu modelo precisa passar no teste do auditor&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Pegue o seu DER e mostre para um analista de negócio, um contador ou alguém de compliance. Não explique nada. Se a pessoa não conseguir apontar onde está a devolução de um Pix, onde está o bloqueio judicial e onde está o saldo disponível &lt;em&gt;versus&lt;/em&gt; o saldo bloqueado, o modelo falhou — mesmo que o código funcione perfeitamente.&lt;/p&gt;&lt;p&gt;Isso não é sobre documentação bonita. É que num domínio regulado, o seu banco de dados &lt;strong&gt;é&lt;/strong&gt; a evidência. Quando o regulador pedir a trilha de uma operação e a resposta exigir um JOIN de seis tabelas mais o conhecimento tácito de que &lt;code&gt;flag_ctrl = 3&lt;/code&gt; significa “estornado por MED”, você não tem um problema técnico. Tem um problema de negócio com prazo.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pense comigo — antes de nomear qualquer coisa&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Esse nome existe no vocabulário de quem opera o negócio?&lt;/strong&gt; Se você inventou o termo, provavelmente inventou também o conceito — e conceito inventado não sobrevive à primeira conversa com o jurídico.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quando eu digo “transação”, o especialista de domínio entende a mesma coisa que eu?&lt;/strong&gt; Pergunte assim, literalmente: &lt;em&gt;“para você, o que é uma transação aqui?”&lt;/em&gt;. Se ele começar a responder com “depende”, você acabou de descobrir que são várias entidades.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Esses dois campos que eu estou juntando têm o mesmo dono e o mesmo ciclo de vida?&lt;/strong&gt; Se um muda por decisão do cliente e o outro por evento do Bacen, eles não pertencem à mesma linha.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se eu sumir amanhã, alguém entende esse schema sem me perguntar nada?&lt;/strong&gt; Essa é a única métrica de qualidade de nomenclatura que importa.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;strong&gt;Princípio 02: Fatos são imutáveis; estado é derivado&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Este é o princípio mais poderoso do artigo, o mais violado na prática, e o único que a contabilidade resolveu &lt;strong&gt;no século XIV&lt;/strong&gt; — enquanto nós ainda escrevemos &lt;code&gt;UPDATE saldo SET ...&lt;/code&gt; em 2026.&lt;/p&gt;&lt;p&gt;Luca Pacioli formalizou as partidas dobradas em 1494 sobre uma ideia simples: você não altera o passado. Você registra um novo lançamento. &lt;strong&gt;O razão é &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.tigrisdata.com/blog/append-only-storage/&quot;&gt;append-only&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;, e o saldo nunca é armazenado como verdade — ele é calculado&lt;/strong&gt;. É a arquitetura de dados mais bem-sucedida da história da humanidade, e ela é anterior ao computador.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 2.1 → O UPDATE destrutivo apaga a única evidência que você tinha&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Compare as duas modelagens de uma transferência de R$ 100 entre contas internas.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Modelo mutável (o que a maioria faz):&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;UPDATE conta SET saldo = saldo - 100 WHERE id = &amp;apos;A&amp;apos;;
UPDATE conta SET saldo = saldo + 100 WHERE id = &amp;apos;B&amp;apos;;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Funciona. É rápido. E destruiu a informação. Não existe mais como saber &lt;em&gt;por que&lt;/em&gt; o saldo mudou, &lt;em&gt;quando&lt;/em&gt;, &lt;em&gt;por ordem de quem&lt;/em&gt;, ou &lt;em&gt;qual era antes&lt;/em&gt;. Você guardou o resultado e jogou fora a causa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Modelo de fatos (razão append-only):&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;id     conta   natureza   valor     origem
─────────────────────────────────────────────────
9001   A       DEBITO     100,00    TRANSF#7712
9002   B       CREDITO    100,00    TRANSF#7712&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nada foi sobrescrito. Duas linhas novas, apontando para a mesma ordem de transferência — e a soma das duas é zero, que é exatamente a garantia das partidas dobradas.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;-- saldo deixa de ser um campo. Vira uma pergunta.
SELECT SUM(CASE WHEN tipo = &amp;apos;CREDITO&amp;apos; THEN valor ELSE -valor END)
FROM lancamento
WHERE conta = &amp;apos;A&amp;apos; AND data_movimento &amp;lt;= :data_corte;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Repare no ganho que caiu de graça: aquele &lt;code&gt;:data_corte&lt;/code&gt; significa que você consegue responder &lt;em&gt;“qual era o saldo em qualquer instante do passado”&lt;/em&gt; — sem nenhuma estrutura adicional. No modelo mutável, essa pergunta é impossível a qualquer preço.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;“Mas isso não é lento?”&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;É a objeção padrão, e ela tem resposta madura: &lt;strong&gt;snapshot&lt;/strong&gt;. Você materializa o saldo consolidado em pontos de corte (fechamento diário, por exemplo) e soma apenas o delta desde o último snapshot. O snapshot é &lt;em&gt;cache&lt;/em&gt;, não verdade — pode ser descartado e reconstruído a qualquer momento a partir dos fatos. O caminho errado é o inverso: guardar o saldo como verdade e tentar reconstruir os fatos depois. Isso não tem volta.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 2.2 → O fato precisa carregar o “porquê”, não só o “quanto”&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Muitos times chegam na metade do caminho: criam uma tabela de histórico com &lt;code&gt;saldo_anterior&lt;/code&gt; e &lt;code&gt;saldo_novo&lt;/code&gt;. Isso é melhor que nada, mas ainda não é história — é o &lt;em&gt;diff&lt;/em&gt; sem o &lt;em&gt;commit message&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Um fato bem modelado responde: &lt;strong&gt;o que aconteceu, quando, por causa de quê, por ordem de quem, e sob qual referência externa&lt;/strong&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;lancamento
├─ id
├─ conta_id
├─ natureza          DEBITO | CREDITO
├─ valor             DECIMAL(18,2) — nunca float, nunca varchar
├─ evento_origem     PIX_RECEBIDO | DEVOLUCAO_MED | TARIFA_TED | ...
├─ referencia_externa E2E ID do Pix, NSU, ID do contrato
├─ lancamento_estornado_id aponta para o fato que este reverte
├─ data_movimento    quando o dinheiro se moveu
├─ data_competencia  a que período isso pertence
└─ data_registro     quando NÓS soubemos&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;E note a linha de estorno: no modelo de fatos, &lt;strong&gt;você nunca apaga nem edita um lançamento errado&lt;/strong&gt;. Você lança o contrário e aponta para o original. É exatamente o que a contabilidade chama de lançamento de retificação, e é o que permite que a resposta para &lt;em&gt;“esse cliente foi debitado indevidamente?”&lt;/em&gt; seja &lt;code&gt;SELECT&lt;/code&gt;, e não arqueologia em log de aplicação.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 2.3 → Tempo é dimensão do dado, não metadado de auditoria&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Quase todo modelo carrega um &lt;code&gt;created_at&lt;/code&gt; e acha que resolveu o tempo. Não resolveu. Em sistemas financeiros existem, no mínimo, &lt;strong&gt;três tempos independentes&lt;/strong&gt;, e confundi-los gera divergência contábil real:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data de movimento&lt;/strong&gt; — quando o dinheiro efetivamente se moveu.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data de competência&lt;/strong&gt; — a que período o fato pertence economicamente.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data de registro (ou conhecimento)&lt;/strong&gt; — quando o seu sistema tomou ciência.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Um exemplo que todo mundo que trabalha com fechamento reconhece: em 3 de agosto, chega uma devolução referente a uma operação de 28 de julho. Movimento: 3/8. Competência: julho. Registro: 3/8. Se o seu modelo tem uma data só, você é obrigado a escolher entre mentir para a contabilidade ou mentir para o extrato do cliente.&lt;/p&gt;&lt;p&gt;E há a pergunta que separa modelo maduro de modelo ingênuo: &lt;em&gt;“me mostre o balancete como ele estava em 31/07, do jeito que nós o víamos naquele dia”&lt;/em&gt;. Isso é modelagem &lt;strong&gt;bitemporal&lt;/strong&gt; — tempo do fato × tempo do conhecimento. Se você fez UPDATE, essa pergunta não tem resposta. Se você guardou fatos com as três datas, é um &lt;code&gt;WHERE&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pense comigo — antes de escrever qualquer UPDATE&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Isso que eu vou sobrescrever é um estado ou é um fato?&lt;/strong&gt; “Endereço do cliente” é estado (talvez). “Saldo”, “status de pagamento”, “limite aprovado” quase sempre são consequências de fatos — &lt;em&gt;&lt;strong&gt;&lt;mark data-color=&quot;#ffff00&quot; style=&quot;background-color: rgb(255, 255, 0); color: rgb(0, 0, 0)&quot;&gt;e fato não se sobrescreve&lt;/mark&gt;&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se alguém perguntar daqui a dois anos por que esse valor mudou, eu consigo responder só com dados?&lt;/strong&gt; Se a resposta envolve “olha o log da aplicação”, o modelo está incompleto. Log expira; dado permanece.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eu consigo reconstruir esse valor do zero se ele for corrompido?&lt;/strong&gt; Se sim, ele é derivado e não deveria ser a fonte da verdade. Se não, ele é fato e não deveria ser mutável. Uma das duas coisas — nunca as duas.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantos tempos diferentes esse fato tem?&lt;/strong&gt; Pergunte ao negócio: &lt;em&gt;“quando isso aconteceu”&lt;/em&gt; e &lt;em&gt;“a que mês isso pertence”&lt;/em&gt; são a mesma data? Se hesitarem, você precisa de duas colunas.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga/comments&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Deixe um comentário&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://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga/comments&quot;&gt;&lt;span&gt;Deixe um comentário&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Princípio 03: Modele para as perguntas, não para os dados&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Aqui mora a discussão relacional × não relacional — e ela é muito menos religiosa do que a internet faz parecer. Normalização otimiza escrita e integridade. Desnormalização otimiza leitura. Nenhuma das duas é “certa” no vácuo. A pergunta correta nunca foi &lt;em&gt;“qual banco eu uso?”&lt;/em&gt;, e sim &lt;strong&gt;“quais perguntas esse dado precisa responder, com que latência, e quantas vezes por segundo?”&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 3.1 → Normalização e desnormalização são estratégias, não moral&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;A terceira forma normal existe para garantir que cada fato seja afirmado em exatamente um lugar — o que torna impossível ter duas verdades contraditórias. É uma proteção de &lt;em&gt;escrita&lt;/em&gt;. Você paga por ela em JOINs.&lt;/p&gt;&lt;p&gt;Desnormalizar é o movimento contrário: aceitar redundância controlada para comprar latência de leitura. Você paga por ela em risco de divergência.&lt;/p&gt;&lt;p&gt;O erro não é escolher um dos dois. O erro é escolher &lt;strong&gt;sem saber qual dos dois custos você está pagando&lt;/strong&gt;. Um sinal claro de que a decisão foi automática: o time normalizou até a última gota uma tabela que só é lida por um dashboard uma vez por dia — e desnormalizou o cadastro de cliente, que é escrito por seis fluxos diferentes.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 3.2 → No NoSQL, o padrão de acesso vem antes da entidade — e é quase irreversível&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Esta é a diferença prática que muita gente descobre tarde demais.&lt;/p&gt;&lt;p&gt;No relacional, você modela entidades e relacionamentos primeiro; se uma consulta nova aparecer daqui a um ano, você cria um índice e segue a vida. O modelo perdoa.&lt;/p&gt;&lt;p&gt;Num banco de chave-partição — DynamoDB, Cassandra —, a chave &lt;strong&gt;é&lt;/strong&gt; a arquitetura. Ela determina onde o dado fisicamente mora, e mudá-la depois significa reescrever a tabela inteira. O modelo não perdoa.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;// extrato: &amp;quot;os lançamentos da conta X no período Y, mais recentes primeiro&amp;quot;
PK = &amp;quot;CONTA#00219-4&amp;quot;
SK = &amp;quot;LANC#2026-08-19T14:32:11Z#a3f9&amp;quot;

// a pergunta vira uma única leitura sequencial, sem JOIN, sem scan:
Query(PK = &amp;quot;CONTA#00219-4&amp;quot;, SK between &amp;quot;LANC#2026-08-01&amp;quot; and &amp;quot;LANC#2026-08-31&amp;quot;)&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Isso é lindo — &lt;em&gt;para essa pergunta&lt;/em&gt;. Agora tente responder &lt;em&gt;“todos os lançamentos com E2E ID X, em qualquer conta”&lt;/em&gt;, ou &lt;em&gt;“soma de tarifas por agência no mês”&lt;/em&gt;. Sem um índice secundário planejado desde o início, essas perguntas custam um scan da base inteira.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Portanto:&lt;/strong&gt; em NoSQL, listar os padrões de acesso &lt;em&gt;antes&lt;/em&gt; de desenhar a chave não é boa prática opcional. É a modelagem inteira.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 3.3 → Um dado pode ter vários modelos — mas só uma fonte da verdade&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;A saída madura para o falso dilema é aceitar que &lt;strong&gt;o mesmo fato bancário quer formas diferentes para consumidores diferentes&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Razão contábil&lt;/strong&gt; — relacional, normalizado, consistência forte, transacional. É a fonte da verdade. Precisa fechar até o centavo e sobreviver a auditoria.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extrato do app&lt;/strong&gt; — documento desnormalizado, particionado por conta e período, leitura em milissegundos, consistência eventual tolerável (o cliente aceita ver o lançamento com 300 ms de atraso; não aceita esperar 4 segundos pela tela).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Base analítica&lt;/strong&gt; — colunar, orientada a agregação, atualizada por batch.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Três modelos, um fato. Isso é CQRS na prática — e não é sofisticação: é reconhecer que “consultar” e “registrar” são atividades com requisitos opostos.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;A regra que não pode ser quebrada&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Projeções &lt;strong&gt;derivam&lt;/strong&gt;; nunca escrevem por conta própria. No instante em que dois caminhos de escrita alimentam duas cópias do mesmo fato de forma independente, você não tem duas visões — tem duas verdades. E quando elas divergirem (e vão divergir), não existirá critério técnico para decidir qual está certa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pense comigo — antes de escolher a tecnologia&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quais são as cinco perguntas que esse dado vai responder em produção?&lt;/strong&gt; Escreva as cinco antes de abrir o Terraform. Se você não consegue escrever nem três, você ainda não entendeu o requisito — e nenhum banco resolve isso.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qual dessas perguntas é feita 10.000 vezes por minuto, e qual é feita uma vez por mês?&lt;/strong&gt; Modele para a primeira, tolere a segunda. Otimizar o caminho frio é a forma mais comum de desperdiçar complexidade.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quem é o dono da verdade desse dado?&lt;/strong&gt; Se você não consegue apontar &lt;em&gt;um&lt;/em&gt; lugar, você já tem um problema de consistência — só ainda não sabe.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que quebra se essa leitura estiver 500 ms atrasada?&lt;/strong&gt; Se a resposta for “nada”, você acabou de ganhar liberdade arquitetural enorme. Se for “o saldo pode ficar negativo”, você acabou de descobrir onde precisa de consistência forte.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;strong&gt;Princípio 04: Consistência tem fronteiras — e você as desenha&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Todo engenheiro sabe recitar ACID. Poucos percebem que &lt;strong&gt;o desenho do modelo é o que decide onde o ACID pode ser aplicado&lt;/strong&gt;. A fronteira transacional não é uma configuração de infraestrutura: é uma consequência direta de como você agrupou os dados.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;&lt;span&gt;Lição 4.1 &lt;/span&gt;→ O agregado define o que cabe em um commit&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Um agregado é o conjunto de dados que precisa mudar junto para que uma invariante do negócio se mantenha. “O saldo da conta nunca pode ficar abaixo do limite” é uma invariante — logo, conta e seus lançamentos do momento precisam ser consistentes no mesmo instante.&lt;/p&gt;&lt;p&gt;O sintoma de agregado mal desenhado é conhecido: você se pega precisando de uma transação que atravessa três serviços. Nesse ponto há exatamente duas saídas honestas — ou a fronteira está errada e esses dados deveriam viver juntos, ou eles são realmente independentes e você precisa de &lt;strong&gt;saga com compensação&lt;/strong&gt;. O que não existe é a terceira: transação distribuída em dois bancos diferentes via &lt;code&gt;@Transactional&lt;/code&gt; e fé.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 4.2 → Estados intermediários são cidadãos de primeira classe&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Um Pix atravessa a fronteira da sua instituição. Entre a ordem do cliente e a confirmação do SPI existe um intervalo em que &lt;strong&gt;o dinheiro precisa estar contabilmente em algum lugar&lt;/strong&gt;. Ele não está mais totalmente disponível para o pagador e ainda não é do recebedor.&lt;/p&gt;&lt;p&gt;Modelo ingênuo:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;conta.saldo -= valor;          // e se o SPI recusar?
conta.processado = true;       // processado significa o quê, exatamente?&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Modelo honesto: o valor sai do saldo disponível e entra numa &lt;strong&gt;posição transitória explícita&lt;/strong&gt; — bloqueio, provisão, conta de trânsito —, e só sai de lá quando existe um fato terminal: liquidação confirmada, devolução, ou expiração de prazo.&lt;/p&gt;&lt;p&gt;Isso muda a modelagem por completo. Você deixa de ter um &lt;code&gt;boolean&lt;/code&gt; e passa a ter uma &lt;strong&gt;máquina de estados com transições registradas como fatos&lt;/strong&gt;: &lt;code&gt;ORDEM_RECEBIDA → RESERVADA → ENVIADA_SPI → LIQUIDADA&lt;/code&gt;, com ramos para &lt;code&gt;DEVOLVIDA&lt;/code&gt; e &lt;code&gt;EXPIRADA&lt;/code&gt;. Cada transição é uma linha. O estado atual é a última linha — ou seja, derivado (Princípio 2 outra vez).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Teste rápido no seu modelo:&lt;/strong&gt; se existe um campo booleano chamado &lt;code&gt;processado&lt;/code&gt;, &lt;code&gt;enviado&lt;/code&gt; ou &lt;code&gt;ok&lt;/code&gt; em algo que atravessa rede, você tem um estado intermediário não modelado. E ele vai aparecer — geralmente às duas da manhã, na forma de dinheiro que “sumiu”.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 4.3 → Idempotência mora no schema, não no &lt;/strong&gt;&lt;code&gt;if&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Sistemas de mensageria sérios entregam &lt;em&gt;at-least-once&lt;/em&gt;. Isso significa que a mesma mensagem &lt;strong&gt;vai&lt;/strong&gt; chegar duas vezes — não é hipótese, é garantia. E a defesa contra isso não é código defensivo; é uma restrição de banco.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;code&gt;-- a defesa real cabe em uma linha
ALTER TABLE lancamento
  ADD CONSTRAINT uk_idempotencia UNIQUE (chave_idempotencia);&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Um &lt;code&gt;SELECT&lt;/code&gt; antes do &lt;code&gt;INSERT&lt;/code&gt; para “verificar se já existe” não protege nada: entre a leitura e a escrita cabem duas instâncias do seu serviço fazendo exatamente a mesma coisa. Só a restrição no banco é atômica. O código apenas trata a violação e devolve sucesso — porque receber duas vezes o mesmo pedido e produzir um efeito só &lt;em&gt;é&lt;/em&gt; o comportamento correto.&lt;/p&gt;&lt;p&gt;No Pix, esse pensamento fica evidente: o &lt;strong&gt;E2E ID&lt;/strong&gt; identifica unicamente a operação ponta a ponta. Ele é uma chave natural de idempotência que o próprio arranjo te entrega de graça. Times que a ignoram e criam um UUID interno próprio descobrem, na primeira reapresentação de mensagem, que duplicaram crédito.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pense comigo — antes de desenhar a fronteira&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qual invariante do negócio essa operação precisa manter &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;no mesmo instante&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;?&lt;/strong&gt; Só o que a invariante exige entra na transação. Todo o resto pode ser eventual — e provavelmente deveria ser.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se isso falhar no meio, o dinheiro está em que lugar do meu modelo?&lt;/strong&gt; Se a resposta for “em lugar nenhum” ou “no ar”, falta uma entidade. Dinheiro em trânsito precisa de endereço.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se essa mensagem chegar três vezes, quantos efeitos eu produzo?&lt;/strong&gt; Se a resposta depende de &lt;em&gt;timing&lt;/em&gt;, você tem uma condição de corrida esperando volume para se manifestar.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Existe uma chave natural que o domínio já me dá?&lt;/strong&gt; E2E ID, NSU, número de contrato, chave da nota. Chave natural do domínio quase sempre é melhor guardiã de unicidade do que qualquer UUID que você gerar.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;strong&gt;Princípio 05: Todo schema evolui; &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;schema-less&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; é uma mentira confortável&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Não existe dado sem schema. Existe schema &lt;em&gt;não declarado&lt;/em&gt;. Quando alguém diz “nosso banco é schema-less”, o que aconteceu de fato foi: o schema saiu do banco — onde era validado, versionado e visível — e foi para dentro do código, onde ninguém valida nada e onde existem, agora, quatro versões diferentes rodando ao mesmo tempo em produção.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 5.1 → O schema não sumiu; ele apenas trocou de dono&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;No relacional, se você tentar inserir texto numa coluna numérica, o banco recusa. É chato e é maravilhoso: o erro acontece &lt;em&gt;na escrita&lt;/em&gt;, com o culpado ainda em cena.&lt;/p&gt;&lt;p&gt;Num documento livre, o dado entra. O erro acontece meses depois, na &lt;em&gt;leitura&lt;/em&gt;, quando alguém tenta somar uma coleção onde 3% dos registros gravaram &lt;code&gt;valor&lt;/code&gt; como string porque uma versão antiga do serviço serializava diferente. Aí o culpado não está mais em cena — e o dado ruim já está em backup, em réplica e no lakehouse.&lt;/p&gt;&lt;p&gt;Escolher NoSQL é legítimo. Escolher NoSQL &lt;em&gt;e&lt;/em&gt; abrir mão de validação é abrir mão de qualidade de dado. &lt;strong&gt;Use &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://www.mongodb.com/company/blog/json-schema-validation--locking-down-your-model-the-smart-way&quot;&gt;schema validation&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; data-component-name=&quot;FootnoteAnchorToDOM&quot; id=&quot;article-innedtk5ZlOkvyh618n6MGddJVI-footnote-anchor-2&quot; href=&quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga#footnote-2&quot;&gt;2&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;use contratos de dados versionados, use um &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;registry&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; — mas declare o schema em algum lugar onde ele seja verificável por máquina, não pela boa vontade do próximo desenvolvedor.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 5.2 → Migração é prática de engenharia contínua, não evento traumático&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;O padrão que torna evolução de schema um não-evento é o &lt;strong&gt;expand / contract&lt;/strong&gt;:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expandir&lt;/strong&gt; — adicionar a nova estrutura, sempre opcional/nulável. Nada quebra; a versão antiga do código ignora o campo novo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escrever nos dois&lt;/strong&gt; — o serviço passa a gravar no formato antigo &lt;em&gt;e&lt;/em&gt; no novo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backfill&lt;/strong&gt; — job idempotente e reprocessável converte o histórico, em lotes, com controle de progresso.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migrar a leitura&lt;/strong&gt; — consumidores passam a ler o campo novo, um a um.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contrair&lt;/strong&gt; — só então o campo antigo morre.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Cada passo é reversível isoladamente, e em nenhum momento existe uma janela em que o sistema precise ficar fora do ar. Compare com o modelo tradicional — “migration na madrugada de sábado, com rollback plan e todo mundo acordado” — e fica claro qual dos dois escala num time que faz deploy todo dia.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Lição 5.3 → Saiba, no dia 1, quais mudanças serão baratas e quais serão caras&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Nem toda evolução custa igual. Vale ter o mapa na cabeça:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Barato:&lt;/strong&gt; adicionar campo opcional; adicionar índice; adicionar novo valor a um enum aberto.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Médio:&lt;/strong&gt; tornar um campo obrigatório; extrair uma entidade nova; alterar precisão numérica.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Caro:&lt;/strong&gt; mudar o tipo de um campo com histórico; mudar a chave de partição; quebrar uma linha em várias; retroagir semântica (”a partir de agora &lt;code&gt;valor&lt;/code&gt; passa a ser líquido, não bruto”).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;O exemplo canônico: um campo &lt;code&gt;valor DECIMAL(18,2)&lt;/code&gt; parece perfeito — até o dia em que a instituição opera câmbio, ou cripto, ou pontos de fidelidade. Transformar &lt;code&gt;valor&lt;/code&gt; em &lt;code&gt;{ montante, moeda }&lt;/code&gt; em 400 milhões de registros é um projeto de trimestre, com dual-write, backfill e reconciliação.&lt;/p&gt;&lt;p&gt;Daí uma heurística que envelhece muito bem: &lt;strong&gt;todo dado que tem unidade deve carregar a unidade desde o primeiro dia&lt;/strong&gt; — moeda com valor, fuso com timestamp, base com taxa. Custa uma coluna hoje. Economiza um trimestre depois.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span&gt;Cuidado com o inverso&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Isso não é licença para generalizar tudo “porque um dia pode mudar”. Modelo excessivamente genérico — o famoso EAV, com &lt;code&gt;chave&lt;/code&gt; e &lt;code&gt;valor&lt;/code&gt; em texto para “flexibilidade” — é a forma mais eficiente já inventada de não modelar nada e transferir o problema para todo mundo que vier depois. Antecipe unidades e dimensões reais do domínio, não hipóteses.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Pense comigo — antes de criar o primeiro campo&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onde esse schema está declarado de forma que uma máquina consiga verificar?&lt;/strong&gt; Se a resposta é “na classe Java”, pergunte: qual das quatro versões em produção?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se eu precisar mudar isso com 300 milhões de registros, qual é o plano?&lt;/strong&gt; Faça a pergunta hoje, enquanto a tabela está vazia e a resposta ainda é barata.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Esse campo tem unidade implícita?&lt;/strong&gt; Valor sem moeda, data sem fuso, percentual sem base. Toda unidade implícita é uma migração futura já agendada.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consigo adicionar um campo aqui sem coordenar deploy com mais ninguém?&lt;/strong&gt; Se não consigo, o acoplamento não está no código — está no dado, e é muito mais caro de desfazer.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;strong&gt;O adulto na sala agora é você&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Os cinco princípios têm uma raiz comum, e ela é bem simples: &lt;strong&gt;dados descrevem a realidade; código apenas a manipula&lt;/strong&gt;. Por isso o código é descartável e os dados não são. Framework é opinião — e opinião muda. Um lançamento contábil de 2019 é um fato, e fato não muda nunca.&lt;/p&gt;&lt;p&gt;O DBA não vai voltar. Aquele documento com o DER pronto não vai chegar. A responsabilidade de fazer as perguntas certas antes de escrever a primeira linha de DDL caiu no colo de quem escreve o código — e a boa notícia é que ela cabe em quinze minutos de conversa com quem entende do negócio, desde que sejam os quinze minutos certos.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Cartão de bolso — as 15 lições&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Nome de coluna é contrato permanente, não variável local.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Não ache conceitos distintos sob um nome genérico.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Seu modelo precisa passar no teste do auditor.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;O UPDATE destrutivo apaga a única evidência que você tinha.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;O fato carrega o “porquê”, não só o “quanto”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tempo é dimensão do dado, não metadado.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Normalizar e desnormalizar são estratégias, não moral.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Em NoSQL, o padrão de acesso vem antes da entidade.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Vários modelos, uma única fonte da verdade.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;O agregado define o que cabe em um commit.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Estados intermediários são cidadãos de primeira classe.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Idempotência mora no schema, não no &lt;code&gt;if&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;O schema não sumiu; trocou de dono.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Migração é prática contínua, não evento traumático.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Saiba desde o dia 1 quais mudanças serão caras.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Uma última provocação, para levar para o próximo refinamento. Antes de aceitar a próxima história com um &lt;code&gt;status&lt;/code&gt; novo, faça a pergunta que resume o artigo inteiro:&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Se alguém precisar provar, daqui a cinco anos, que isso aqui aconteceu exatamente assim — o meu modelo consegue provar sozinho?”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Se a resposta depender do log da aplicação, da memória de alguém do time ou de uma planilha no drive de alguém, o modelo ainda não está pronto. E vale a pena gastar mais quinze minutos hoje — porque o código que você vai escrever depois disso é descartável de qualquer jeito.&lt;/p&gt;&lt;div data-component-name=&quot;FootnoteToDOM&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; id=&quot;article-innedtk5ZlOkvyh618n6MGddJVI-footnote-1&quot; href=&quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga#footnote-anchor-1&quot; contenteditable=&quot;false&quot;&gt;1&lt;/a&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;mark&gt;algo oculto, misterioso, enigmático ou difícil de compreender&lt;/mark&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-component-name=&quot;FootnoteToDOM&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; id=&quot;article-innedtk5ZlOkvyh618n6MGddJVI-footnote-2&quot; href=&quot;https://chroniclesofapragmaticprogrammer.substack.com/p/quando-orientacao-a-objetos-estraga#footnote-anchor-2&quot; contenteditable=&quot;false&quot;&gt;2&lt;/a&gt;&lt;div&gt;&lt;p&gt;A flexibilidade dos bancos de dados orientados a documentos (como o MongoDB) é incrível: você começa a modelar sem amarras, itera rápido e entrega funcionalidades sem a dor de cabeça inicial de migrações complexas. Mas essa liberdade tem um preço. Conforme o sistema cresce, múltiplos microsserviços ou desenvolvedores começam a escrever na mesma base, e a ausência de regras rígidas pode transformar sua coleção em um verdadeiro faroeste de dados inconsistentes.&lt;/p&gt;&lt;p&gt;É aí que entra o &lt;strong&gt;Schema Validation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Trata-se de um contrato definido diretamente no banco que estabelece regras claras sobre como os documentos devem ser estruturados antes de serem persistidos. Em vez de depender exclusivamente da camada de aplicação para garantir que nada saia dos trilhos, o próprio banco rejeita gravações que violem os padrões definidos.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;O que o Schema Validation resolve no dia a dia&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Campos obrigatórios:&lt;/strong&gt; Garante que atributos essenciais nunca fiquem nulos ou ausentes em documentos críticos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tipagem estrita:&lt;/strong&gt; Evita bugs silenciosos de coerção de tipo (como receber uma &lt;code&gt;string&lt;/code&gt; onde a aplicação espera um &lt;code&gt;decimal&lt;/code&gt; ou &lt;code&gt;int&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enums e valores permitidos:&lt;/strong&gt; Restringe o preenchimento de campos de status e categorias a listas pré-aprovadas.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bloqueio de campos não previstos:&lt;/strong&gt; Impede que dados acidentais ou formatos antigos poluam novos registros (&lt;code&gt;additionalProperties: false&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Na prática, o Schema Validation une o melhor de dois mundos: mantém a agilidade do modelo orientado a documentos durante o desenvolvimento inicial e permite “travar” o modelo quando ele atinge maturidade arquitetural, garantindo governança e integridade sem perder a flexibilidade do NoSQL.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;clear: both&quot;&gt;&lt;/p&gt;&lt;p data-bqr-info=&quot;attachment&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://substack-post-media.s3.amazonaws.com/public/images/857129f9-26a1-42d5-8efe-43bdc190e3c8_2768x1848.jpeg&quot;&gt;&lt;/p&gt;</summary><author><name>Rafael Miguel</name></author><source gr:stream-id="feed/https://chroniclesofapragmaticprogrammer.substack.com/feed"><id>tag:google.com,2005:reader/feed/https://chroniclesofapragmaticprogrammer.substack.com/feed</id><title type="html">Chronicles of a Pragmatic Programmer</title><link rel="alternate" href="https://chroniclesofapragmaticprogrammer.substack.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788499488000"><id gr:original-id="https://medium.com/p/f4883917f939">tag:google.com,2005:reader/item/00000a0600000096</id><category term="ai"></category><category term="chatgpt"></category><category term="llm"></category><category term="agentic-ai"></category><category term="openai"></category><title type="html">ChatGPT Work: When the Chat Window Becomes a Control Plane</title><published>2026-09-04T05:24:48Z</published><updated>2026-09-04T05:24:48Z</updated><link rel="alternate" href="https://medium.com/data-and-beyond/chatgpt-work-when-the-chat-window-becomes-a-control-plane-f4883917f939?source=rss-f171d77cdec6------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/data-and-beyond/chatgpt-work-when-the-chat-window-becomes-a-control-plane-f4883917f939?source=rss-f171d77cdec6------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/2600/0*WQscGoUn2YY03A7o&quot; width=&quot;3840&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Inside OpenAI’s attempt to unify reasoning, apps, browsers, artifacts, automation, and human approval — and why the real shift is bigger…&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/data-and-beyond/chatgpt-work-when-the-chat-window-becomes-a-control-plane-f4883917f939?source=rss-f171d77cdec6------2&quot;&gt;Continue reading on Data And Beyond »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>TONI RAMCHANDANI</name></author><source gr:stream-id="feed/https://toniramchandani.medium.com/feed"><id>tag:google.com,2005:reader/feed/https://toniramchandani.medium.com/feed</id><title type="html">Stories by TONI RAMCHANDANI on Medium</title><link rel="alternate" href="https://medium.com/@toniramchandani?source=rss-f171d77cdec6------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788492661000"><id gr:original-id="https://medium.com/p/4459cdb335e0">tag:google.com,2005:reader/item/00000a87000000cf</id><category term="software-development"></category><category term="test-automation"></category><category term="quality-assurance"></category><category term="software-testing"></category><category term="software-engineering"></category><title type="html">Your Test Suite Knows What Broke. It Rarely Knows Why It Matters.</title><published>2026-09-04T03:31:01Z</published><updated>2026-09-04T03:31:01Z</updated><link rel="alternate" href="https://manishsaini74.medium.com/your-test-suite-knows-what-broke-it-rarely-knows-why-it-matters-4459cdb335e0?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/your-test-suite-knows-what-broke-it-rarely-knows-why-it-matters-4459cdb335e0?source=rss-2afcb904d789------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1672/1*nEIrAKNZ-4MjjHkqt0j16w.png&quot; width=&quot;1672&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We encode thousands of lines explaining how to test software, then forget to preserve the one sentence that explains why the test deserves…&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://manishsaini74.medium.com/your-test-suite-knows-what-broke-it-rarely-knows-why-it-matters-4459cdb335e0?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="1788492600000"><id gr:original-id="https://scrolltest.com/?p=10203">tag:google.com,2005:reader/item/0000044400000314</id><category term="Javascript"></category><category term="Testing"></category><title type="html">Day 6: JavaScript Objects and Multi-Dimensional Arrays in Test Automation</title><published>2026-09-04T03:30:00Z</published><updated>2026-09-04T03:30:00Z</updated><link rel="alternate" href="https://scrolltest.com/js-playwright-framework-day-06-objects-multidimensional-arrays/" type="text/html"></link><summary type="html">&lt;p&gt;Day 6 of the JS to Playwright Framework series. Objects and multi-dimensional arrays from LearningPlaywrightBatch — primitive vs reference, descriptors, spread, getters/setters, and 2D grids you will use for JSON fixtures, API bodies, and web tables.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/js-playwright-framework-day-06-objects-multidimensional-arrays/&quot;&gt;Day 6: JavaScript Objects and Multi-Dimensional Arrays in Test Automation&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788489360000"><id gr:original-id="https://medium.com/p/64158724dbb8">tag:google.com,2005:reader/item/0000091b00000089</id><category term="technology"></category><category term="software-testing"></category><category term="coding"></category><category term="software-development"></category><category term="programming"></category><title type="html">Data Driven Testing in Playwright TypeScript with CSV Files</title><published>2026-09-04T02:36:00Z</published><updated>2026-09-04T02:36:00Z</updated><link rel="alternate" href="https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1920/1*XMKXr1__0VLVt2UqnQ5KAA.jpeg&quot; width=&quot;1920&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Learn how to implement data-driven API testing in Playwright with TypeScript using a CSV file, with a code example and a step-by-step guide.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2&quot;&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/@iamfaisalkhatri/feed"><id>tag:google.com,2005:reader/feed/https://medium.com/@iamfaisalkhatri/feed</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788489360000"><id gr:original-id="https://medium.com/p/64158724dbb8">tag:google.com,2005:reader/item/00000a8300000088</id><category term="technology"></category><category term="software-testing"></category><category term="coding"></category><category term="software-development"></category><category term="programming"></category><title type="html">Data Driven Testing in Playwright TypeScript with CSV Files</title><published>2026-09-04T02:36:00Z</published><updated>2026-09-04T02:36:00Z</updated><link rel="alternate" href="https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2" type="text/html"></link><summary type="html">&lt;div&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2&quot;&gt;&lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://cdn-images-1.medium.com/max/1920/1*XMKXr1__0VLVt2UqnQ5KAA.jpeg&quot; width=&quot;1920&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Learn how to implement data-driven API testing in Playwright with TypeScript using a CSV file, with a code example and a step-by-step guide.&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;https://medium.com/@iamfaisalkhatri/data-driven-testing-in-playwright-typescript-with-csv-files-64158724dbb8?source=rss-d56167afca7d------2&quot;&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><author><name>Mohammad Faisal Khatri</name></author><source gr:stream-id="feed/https://medium.com/feed/@iamfaisalkhatri"><id>tag:google.com,2005:reader/feed/https://medium.com/feed/@iamfaisalkhatri</id><title type="html">Stories by Mohammad Faisal Khatri on Medium</title><link rel="alternate" href="https://medium.com/@iamfaisalkhatri?source=rss-d56167afca7d------2" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788480000000"><id gr:original-id="https://qualitywithmillan.github.io/blog/one-sneaky-prompt-changed-everything-day-11">tag:google.com,2005:reader/item/000008500000005b</id><category term="blog"></category><category term="engineering"></category><category term="ai"></category><category term="evals"></category><category term="llm-as-a-judge"></category><category term="llm-evals"></category><title type="html">One sneaky prompt changed everything - day 11</title><published>2026-09-04T00:00:00Z</published><updated>2026-09-04T00:00:00Z</updated><link rel="alternate" href="https://qualitywithmillan.github.io/blog/one-sneaky-prompt-changed-everything-day-11.html" type="text/html"></link><summary type="html">&lt;p&gt;
 Written by -

    
    
    
        &lt;strong&gt;Millan Kaul&lt;/strong&gt;
    

&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I tried one prompt-injection test today. My “helpful” assistant became very obedient.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
  &lt;img class=&quot;bqrUnknownImgSize&quot; src=&quot;https://qualitywithmillan.github.io/assets/images/2026/09/evals_day_11.png&quot; alt=&quot;Image showing LLM test prompt injection&quot;&gt;
  &lt;figcaption style=&quot;text-align: center&quot;&gt;AI safety failures often arrive dressed as normal requests.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;article-K6BodTrmtvbpt90gHdr08RidlOs-what-i-did-today&quot;&gt;What I did today:&lt;/h3&gt;
&lt;p&gt;I added an instruction that tried to override the system’s original task. Then I checked whether the model followed its intended role or followed the attacker’s request.&lt;/p&gt;

&lt;h3 id=&quot;article-K6BodTrmtvbpt90gHdr08RidlOs-what-surprised-me&quot;&gt;What surprised me:&lt;/h3&gt;
&lt;p&gt;The failure did not look dramatic. It looked like a normal user message.&lt;/p&gt;

&lt;h3 id=&quot;article-K6BodTrmtvbpt90gHdr08RidlOs-my-qa-takeaway&quot;&gt;My QA takeaway:&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Security testing for AI needs realistic, boring-looking attacks—not just obvious bad words.&lt;/li&gt;
  &lt;li&gt;AI safety failures often arrive dressed as normal requests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What is the first prompt injection you would test?&lt;/p&gt;

&lt;p&gt;#AISafety #AIEvals #SecurityTesting&lt;/p&gt;</summary><author><name>Millan Kaul</name></author><source gr:stream-id="feed/https://qualitywithmillan.github.io/feed.xml"><id>tag:google.com,2005:reader/feed/https://qualitywithmillan.github.io/feed.xml</id><title type="html">Quality With Millan</title><link rel="alternate" href="https://qualitywithmillan.github.io/" type="text/html"></link></source></entry><entry gr:crawl-timestamp-msec="1788472800000"><id gr:original-id="https://scrolltest.com/?p=7788">tag:google.com,2005:reader/item/0000044400000313</id><category term="AI Testing"></category><category term="Testing"></category><title type="html">CrewAI for QA Teams: Multi-Agent Testing Pipelines That Design, Code, Review, and Report</title><published>2026-09-03T22:00:00Z</published><updated>2026-09-03T22:00:00Z</updated><link rel="alternate" href="https://scrolltest.com/crewai-qa-teams-multi-agent-testing-design-code-review/" type="text/html"></link><summary type="html">&lt;p&gt;4-agent QA crew: designer, coder, reviewer, bug reporter. CrewAI orchestration with Playwright.&lt;/p&gt;
&lt;p&gt;The post &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com/crewai-qa-teams-multi-agent-testing-design-code-review/&quot;&gt;CrewAI for QA Teams: Multi-Agent Testing Pipelines That Design, Code, Review, and Report&lt;/a&gt; appeared first on &lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; rel=&quot;nofollow&quot; href=&quot;https://scrolltest.com&quot;&gt;Software Testing &amp;amp; Automation&lt;/a&gt;.&lt;/p&gt;</summary><author><name>Pramod Dutta</name></author><source gr:stream-id="feed/https://scrolltest.com/feed/"><id>tag:google.com,2005:reader/feed/https://scrolltest.com/feed/</id><title type="html">Software Testing &amp; Automation</title><link rel="alternate" href="https://scrolltest.com" type="text/html"></link></source></entry></feed>