{"id":2127,"date":"2026-10-19T18:10:00","date_gmt":"2026-10-19T18:10:00","guid":{"rendered":"https:\/\/askdoctorlive.com\/blog\/?p=2127"},"modified":"2026-10-19T18:10:00","modified_gmt":"2026-10-19T18:10:00","slug":"gitops-prune-incident-clinic","status":"publish","type":"post","link":"https:\/\/askdoctorlive.com\/blog\/gitops-prune-incident-clinic\/","title":{"rendered":"The Night the Appointments Vanished: A GitOps Story"},"content":{"rendered":"<p>Clinical teams already know the shape of the story we are about to tell. A routine step, performed in a hurry, exposes a gap in the protocol; the patient \u2014 in this case, a patient portal \u2014 is unharmed because the team followed their version of a time-out, and the protocol is rewritten so the gap cannot open twice. The team in question is a fictional but faithful composite: three people running the digital side of a small multi-specialty clinic network, their booking system and clinical content living on infrastructure managed through GitOps. The names are invented and the details are drawn from public runbooks rather than any real clinic, but the failure mode itself is uncomfortably ordinary. What happened to them one Tuesday is the best teaching case we know for why deletion needs a protocol of its own \u2014 and why automation, for all its virtues, hands the hardest judgement calls back to people.<\/p>\n<h2>The Clinic&#8217;s GitOps Setup, in Plain Terms<\/h2>\n<p>Their arrangement was orthodox: every configuration described declaratively in a repository, an automated reconciler pulling that description and keeping the live environment aligned, changes arriving only through reviewed merges. Three services ran in production \u2014 appointments, results, and a content service serving <a href=\"https:\/\/askdoctorlive.com\/blog\/bronchitis-symptoms-causes-early-signs-treatment-and-when-to-seek-help\/\">guidance ranging from bronchitis symptoms to clinic policies<\/a>. Each service had its own data volume. Reconciliation had been quiet for weeks, which is precisely the condition under which people stop rehearsing for its failure.<\/p>\n<h2>Tuesday, 02:14: The Finding<\/h2>\n<p>A developer merging a routine update to the appointments service had resolved a conflict badly. The resolution silently dropped that service&#8217;s manifest from the directory the reconciler watched in production. Nothing errored. The merge simply described a world in which the appointments service did not exist \u2014 and the reconciler, faithful as designed, made the live system match the description. It removed the service and, because the underlying storage carried a deletion reclaim policy, it removed the appointments data volume with it. The portal&#8217;s booking page went blank at a few minutes past two in the morning.<\/p>\n<p>Worth underlining: no outsider attacked anything. The system worked exactly as configured, and the configuration had a hole shaped like a dropped file. Every safeguard that mattered had to come from the people, which is how medicine would tell the story too.<\/p>\n<h2>The GitOps Recovery, Step by Step<\/h2>\n<p>What follows is the six-step sequence the team actually worked through, lightly retold. Clinics will recognise the skeleton: stop, assess, treat, rehabilitate, resume, prevent.<\/p>\n<ol>\n<li><strong>Stop the automation.<\/strong> Before anything else, reconciliation was suspended so the recovering system could not be &#8220;corrected&#8221; back into the damaged state. Their tool&#8217;s suspension survives outside the repository \u2014 one less thing the broken merge could undo. Teams on other platforms need to be careful here: without an explicit override declared, a parent application can quietly re-enable what you disabled.<\/li>\n<li><strong>Assess, with the chart open.<\/strong> The team reconstructed events from three sources \u2014 the application&#8217;s own history, the reconciler&#8217;s event log, and the repository&#8217;s record of merges. The dropped file showed up quickly once the three timelines were laid side by side. Guesswork was unnecessary; the records were sufficient, which is the quiet reward for keeping records.<\/li>\n<li><strong>Treat the configuration.<\/strong> A revert went up as a reviewed pull request restoring the manifest, and was approved by the colleague who had not written it. Normal doorway, normal checks \u2014 an incident is the worst possible time to bypass the process that prevents incidents.<\/li>\n<li><strong>Rehabilitate the data.<\/strong> Configuration restored does not mean information restored. The appointments data came back from the overnight backup, restored into the re-created volume. The gap between the last backup and the incident was accounted for and reconciled by hand against the phone log. Data restoration is where the schedule risk lives, not the file recovery.<\/li>\n<li><strong>Resume, watching.<\/strong> Reconciliation was switched back on and the service observed through a full booking cycle before anyone declared the patient stable. The team also verified the content service and the results service \u2014 neighbours, in infrastructure as in wards, often share the injury.<\/li>\n<li><strong>Rewrite the protocol.<\/strong> The last step is the one that distinguishes a learning organisation from a lucky one, and it is the next section of this story.<\/li>\n<\/ol>\n<h2>What the Clinic Changed Afterwards<\/h2>\n<p>Three permanent changes followed, each mapped to the failure that made it obvious. First, deletion protection: the appointments namespace and every data volume were marked so that automated cleanup could never remove them, and the storage policy was switched so that removed volumes outlive the services that used them. Second, a pre-merge check: their pipeline now inspects every change and raises a loud flag when files describing namespaces, data volumes or custom resource definitions disappear from a production directory \u2014 the exact signature of this incident, caught before merge rather than after. Third, a drill: the team rehearsed the suspension-and-restore sequence on the staging copy, on a weekday afternoon, with coffee. The real event had cost them a night; the rehearsal cost an hour and made the next one cheaper still.<\/p>\n<p>Equally instructive is what did not happen afterwards. Nobody proposed &#8220;being more careful&#8221; as a policy, and nobody blamed the reconciler for doing what it was configured to do. The post-incident review spent its hour on the system: which guard was missing, where the deletion policy was too permissive, and why the merge review had not surfaced a removed file. Blame found no purchase because the protocol had a hole, and holes are repairable in ways that scapegoats are not. Clinics will recognise that stance; it is how they have run mortality reviews for decades.<\/p>\n<p>For the pocket version \u2014 the whole protocol on one card, pinned above the desk where the next tired reviewer will actually see it:<\/p>\n<ul>\n<li>Suspend reconciliation first; resume last, after verification.<\/li>\n<li>Reconstruct events from the reconciler&#8217;s records and the repository before touching anything.<\/li>\n<li>Revert through the reviewed doorway, never around it.<\/li>\n<li>Restore data from backup, and account for the gap since the last copy.<\/li>\n<li>Guard namespaces, volumes and custom definitions against automated cleanup.<\/li>\n<li>Flag any merged change that removes them, before it merges.<\/li>\n<\/ul>\n<p>The full runbook behind these steps \u2014 including the arguments for each guard \u2014 is documented in <a href=\"https:\/\/www.xopsschool.com\/gitops\/\">the GitOps reference at the Ops Atlas<\/a>, which the team used as their source text and this retelling follows.<\/p>\n<h2>The GitOps Numbers After the Rewrite<\/h2>\n<p>Because this team measures, there is a quantified aftermath. In the week following the changes, the median stretch from an approved merge to a fully healthy production service came out at roughly three and three-quarters of a minute. The slower tail mattered more than the median, though, and the team studied it: at the ninetieth percentile the same journey took around 26 minutes, driven almost entirely by renders of large template sets rather than by the reconciliation itself. Speed, it turned out, was a pipeline question, not a safety question \u2014 a distinction that would have remained invisible without the measurement.<\/p>\n<h2>Why Clinics Should Read an Infrastructure Story<\/h2>\n<p>Because the pattern transfers whole. Patient safety practice is built on the insight that people fail predictably and systems should be shaped to catch them, and a deployment pipeline is just a system with that same obligation. The clinic team&#8217;s near-loss of booking data is, in miniature, the argument for checklists, time-outs and counted instruments at the end of every procedure: trust the process, verify independently, and let the records \u2014 not memory \u2014 decide what happened. Notice too how small the team was. Three people, one evening, no drama heroes; the protocol did the heavy lifting, exactly as it is supposed to.<\/p>\n<p>It also transfers to the everyday content side of a practice. A portal that patients rely on for <a href=\"https:\/\/askdoctorlive.com\/blog\/how-to-manage-cough-and-cold-at-home-safely-and-effectively\/\">safe, sensible advice on managing a cough or cold at home<\/a>, or for understanding <a href=\"https:\/\/askdoctorlive.com\/blog\/balance-problems-symptoms-causes-diagnosis-and-treatment\/\">what balance problems do and do not mean<\/a>, is part of the care pathway whether it is labelled that way or not. Treating the plumbing that delivers it with protocol-level seriousness is not an engineering fashion. It is the same professional instinct, wearing different clothes, on a different kind of night shift.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A clinic IT team&#8217;s near-loss of its booking service, retold as a six-step recovery \u2014 and the three protocol changes that made it impossible to repeat.<\/p>\n","protected":false},"author":11,"featured_media":2128,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[703],"tags":[],"class_list":["post-2127","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-health"],"_links":{"self":[{"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/posts\/2127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/comments?post=2127"}],"version-history":[{"count":1,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/posts\/2127\/revisions"}],"predecessor-version":[{"id":2149,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/posts\/2127\/revisions\/2149"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/media\/2128"}],"wp:attachment":[{"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/media?parent=2127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/categories?post=2127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/askdoctorlive.com\/blog\/wp-json\/wp\/v2\/tags?post=2127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}