<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Mark Burton Blog</title>
        <link>https://blog.mark-burton.com/</link>
        <description>Mark Burton Blog</description>
        <lastBuildDate>Thu, 20 Nov 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Moving from Cloudflare to GCore: A DNS Migration Tale]]></title>
            <link>https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore</link>
            <guid>https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore</guid>
            <pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[After using Cloudflare for years, I decided to try an EU-based provider and migrated my DNS to GCore. This post covers the process.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-change-in-the-air">A Change in the Air<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#a-change-in-the-air" class="hash-link" aria-label="Direct link to A Change in the Air" title="Direct link to A Change in the Air" translate="no">​</a></h2>
<p>I've used Cloudflare for years to manage DNS and as a CDN, and it's always worked well for me—especially on the free tier, where I've never needed support. But as I have an abundence of freetime (thanks to heart surgery), I started looking at EU-based alternatives.</p>
<p>That's when I found <a href="https://gcore.com/" target="_blank" rel="noopener noreferrer" class="">GCore</a>, a provider based in Luxembourg since 2014. They offer DNS and CDN services, making it easy to switch away from Cloudflare if you want everything under one roof.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-rather-necessary-spring-cleaning">A Rather Necessary Spring Cleaning<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#a-rather-necessary-spring-cleaning" class="hash-link" aria-label="Direct link to A Rather Necessary Spring Cleaning" title="Direct link to A Rather Necessary Spring Cleaning" translate="no">​</a></h2>
<p>Before embarking upon this migration, I thought it prudent to inspect my existing DNS configuration at Cloudflare. What I discovered was, I dare say, rather enlightening:</p>
<ul>
<li class="">7 TXT records for various services (Mailgun, Zoho, Keybase, and such)</li>
<li class="">8 MX records for mark-burton.com (though I must admit, 4 were for a Google email setup long since abandoned)</li>
<li class="">10 CNAMEs, half of which no longer resolved because I'd powered down the Pi server years ago</li>
</ul>
<p>By Jove, it was high time for a proper tidy-up! I proceeded forthwith to delete all those obsolete records. No sense in migrating digital detritus to a new service, quite so.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-migration-proper">The Migration Proper<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#the-migration-proper" class="hash-link" aria-label="Direct link to The Migration Proper" title="Direct link to The Migration Proper" translate="no">​</a></h2>
<p>Creating a new zone in GCore appeared rather straightforward—one simply selects "New Zone", provides the domain name, and the system attempts to pull in the existing records from the current configuration. However, I must report that it didn't work frightfully well. Several records went missing in the process.</p>
<p>I then attempted to export the zone file from Cloudflare and import it directly to GCore. This is where matters became rather more interesting. The exported file looked something like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; Domain:     mark-burton.com.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; Exported:   2025-10-22 14:14:25</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; This file is intended for use for informational and archival</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; purposes ONLY and MUST be edited before use on a production</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; CNAME Records</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">blog.mark-burton.com.	1	IN	CNAME	goofy-williams-12014c.netlify.com. ; cf_tags=cf-proxied:true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">email.secretsanta.mark-burton.com.	1	IN	CNAME	eu.mailgun.org. ; cf_tags=cf-proxied:false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">hucknurdle.mark-burton.com.	1	IN	CNAME	venerable-youtiao-eb36bf.netlify.app. ; cf_tags=cf-proxied:true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.	1	IN	CNAME	picore.blogdns.net. ; cf_tags=cf-proxied:false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">verify.secretsanta.mark-burton.com.	1	IN	CNAME	mailgun.org. ; cf_tags=cf-proxied:false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; MX Records</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	MX	50 mx3.zoho.eu.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	MX	20 mx2.zoho.eu.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	MX	10 mx.zoho.eu.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; TXT Records</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.	1	IN	TXT	"keybase-site-verification=Snip"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.	1	IN	TXT	"v=spf1 include:_spf.google.com ~all"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.	1	IN	TXT	"markburton.azurewebsites.net"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mx._domainkey.secretsanta.mark-burton.com.	1	IN	TXT	"k=rsa; Snip"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	TXT	"v=spf1 include:zoho.eu ~all"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	TXT	"zoho-verification=zb15358196.zmverify.zoho.eu"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">secretsanta.mark-burton.com.	1	IN	TXT	"v=spf1 include:eu.mailgun.org ~all"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-ttl-conundrum">The TTL Conundrum<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#the-ttl-conundrum" class="hash-link" aria-label="Direct link to The TTL Conundrum" title="Direct link to The TTL Conundrum" translate="no">​</a></h2>
<p>The principal issue, you see, was that Cloudflare had set the TTL (Time To Live) to <code>1</code> for every single record. Most decidedly problematic, as the free tier of GCore only supports values of 120 or higher. I found myself engaged in a spot of find-and-replace work, changing each of those <code>1</code> values to <code>120</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-spf-record-situation">The SPF Record Situation<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#the-spf-record-situation" class="hash-link" aria-label="Direct link to The SPF Record Situation" title="Direct link to The SPF Record Situation" translate="no">​</a></h2>
<p>Whilst reviewing the records, I noticed that Cloudflare had rather helpfully warned me about multiple SPF records—quite simply put, having more than one is not valid. Using <a href="https://mxtoolbox.com/SPFRecordGenerator.aspx?domain=mark-burton.com&amp;prefill=true" target="_blank" rel="noopener noreferrer" class="">MXToolbox</a>, I consolidated those records into a single, proper SPF entry. Rather more elegant, I venture to suggest.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-moment-of-truth">The Moment of Truth<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#the-moment-of-truth" class="hash-link" aria-label="Direct link to The Moment of Truth" title="Direct link to The Moment of Truth" translate="no">​</a></h2>
<p>Now comes the critical step: updating the nameservers in my domain registrar's admin console. It's a change that shouldn't be taken lightly—if you get it wrong, your site and email can disappear until it's fixed.</p>
<p><img decoding="async" loading="lazy" alt="Fasthosts custom nameservers should GCore nameservers" src="https://blog.mark-burton.com/assets/images/fasthosts_custom_gcore_nameservers-816ca61805e69f243b2fc3ee0b5ddeb4.png" width="911" height="774" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="certificate-disaster-and-rollback">Certificate disaster and Rollback<a href="https://blog.mark-burton.com/2025/10/22/moving-from-cloudflare-to-gcore#certificate-disaster-and-rollback" class="hash-link" aria-label="Direct link to Certificate disaster and Rollback" title="Direct link to Certificate disaster and Rollback" translate="no">​</a></h2>
<p>A bit of an oversight meant everything I host on Netlify, so this blog and a Wordle clone tailored to my home town stopped working. To make matters worse I found out when Mum sent me a message to tell me <a href="https://hucknurdle.mark-burton.com/" target="_blank" rel="noopener noreferrer" class="">Hucknurdle</a> had stopped working for her.</p>
<p>Visitors were greeted with
<img decoding="async" loading="lazy" alt="Invalid Certificate Warning" src="https://blog.mark-burton.com/assets/images/gcore_blog_cert_error-34a93e44d0a4db8fd90001a6bb1bee01.png" width="1285" height="825" class="img_ev3q"></p>
<p>As I did not fully understand the root cause of the problem, and was concerned about <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security" target="_blank" rel="noopener noreferrer" class="">how HSTS works</a> and what the 2 year max-age meant, I reverted the nameserver change, thankfully the TTL was quite low so it quickly got things back online.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">:~$ dig NS mark-burton.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">; &lt;&lt;&gt;&gt; DiG 9.18.39-0ubuntu0.22.04.2-Ubuntu &lt;&lt;&gt;&gt; NS mark-burton.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; global options: +cmd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; Got answer:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 52032</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; OPT PSEUDOSECTION:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">; EDNS: version: 0, flags:; udp: 1232</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; QUESTION SECTION:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;mark-burton.com.               IN      NS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; ANSWER SECTION:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.        3600    IN      NS      ns1.gcorelabs.net.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mark-burton.com.        3600    IN      NS      ns2.gcdn.services.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; Query time: 43 msec</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; WHEN: Sun Nov 02 14:10:04 CET 2025</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">;; MSG SIZE  rcvd: 106</span><br></span></code></pre></div></div>
<p>The root of the problem was a certificate I added to Netlify several years ago, as the image shows Netlify was using a CloudFlare certificate.
<img decoding="async" loading="lazy" alt="Invalid Certificate Details" src="https://blog.mark-burton.com/assets/images/gcore_blog_cert_details-fb25589bb416c99c5dce209565975ae4.png" width="1239" height="755" class="img_ev3q"></p>
<p>That certificate as described by <a href="https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/" target="_blank" rel="noopener noreferrer" class="">Cloudflare</a> is valid for traffic which is proxied by Cloudflare</p>
<blockquote>
<p>If your origin only receives traffic from proxied records, use Cloudflare origin CA certificates to encrypt traffic between Cloudflare and your origin web server and reduce bandwidth consumption. Once deployed, these certificates are compatible with <a href="https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full-strict/" target="_blank" rel="noopener noreferrer" class="">Strict SSL mode</a>.</p>
</blockquote>
<blockquote>
<p>For more background information on origin CA certificates, refer to the introductory <a href="https://blog.cloudflare.com/cloudflare-ca-encryption-origin/" target="_blank" rel="noopener noreferrer" class="">blog post</a>.</p>
</blockquote>
<p>With that understood the fix was almost embarrassingly easy, the Cloudflare origin certificate was never meant to be used as a public facing certificate,so with Clouflare prixying turned off for my sites I switched to a <a href="https://letsencrypt.org/" target="_blank" rel="noopener noreferrer" class="">Let's Encrypt</a> certificate.</p>
<p><img decoding="async" loading="lazy" alt="Netlify Domain Management Screen Let&amp;#39;s Encrypt Certificate Request" src="https://blog.mark-burton.com/assets/images/gcore_netlify_letsencrypt_request-d1c5e7666c34434336ad10d96c255c47.png" width="902" height="398" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Netlify Domain Management Screen Let&amp;#39;s Encrypt Certificate Provision" src="https://blog.mark-burton.com/assets/images/gcore_netlify_letsencrypt_provision-8c088ee4808a29c51fb5e64b522c4fd6.png" width="948" height="506" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Netlify Domain Management Screen Let&amp;#39;s Encrypt Certificate" src="https://blog.mark-burton.com/assets/images/gcore_netlify_letsencrypt-92bfcd7ec24c535f1b59517b0b6ba6dc.png" width="755" height="621" class="img_ev3q"></p>
<p>Let's see what certificate we have in place now</p>
<p><img decoding="async" loading="lazy" alt="Let&amp;#39;s Encrypt Certificate Browser Confirmation" src="https://blog.mark-burton.com/assets/images/gcore_letsencrypt_cert_details-1559e87ad12c3c4ea737a2a9cd367ebe.png" width="1184" height="691" class="img_ev3q"></p>
<p>With the Let's Encrypt certificate in place it is time to change the nameservers back to Gcore.</p>
<p>##Success</p>
<p>This time everything is running smoothly and my move away from Cloudflare is complete.</p>]]></content:encoded>
            <category>DNS</category>
            <category>CDN</category>
            <category>Infrastructure</category>
            <category>GCore</category>
            <category>Cloudflare</category>
        </item>
        <item>
            <title><![CDATA[A Deeper Dive into GitHub Spec-Kit - Learning from Initial Missteps]]></title>
            <link>https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit</link>
            <guid>https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit</guid>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Following my rather disappointing first attempt with spec-kit, I embark upon a proper investigation of the /speckit.analyze command and discover precisely how Copilot managed to mark incomplete work as complete. Most illuminating!]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reviewing-what-went-wrong">Reviewing What Went Wrong<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#reviewing-what-went-wrong" class="hash-link" aria-label="Direct link to Reviewing What Went Wrong" title="Direct link to Reviewing What Went Wrong" translate="no">​</a></h2>
<p>After my <a class="" href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit">first adventures with GitHub spec-kit</a>, I was left pretty disappointed with the results. The structure and architecture looked fine on the surface, but the actual implementation was mostly placeholders. Tasks were marked as complete when they clearly weren’t, and authentication that was supposed to use Azure AD and Google was just accepting any username and password. Not good enough.</p>
<p>Since starting this experiment, I’ve switched to Claude Sonnet 4.5, which is a big step up from the previous model. With better prompts and a more capable LLM, I wanted to dig into why things went wrong the first time—and, more importantly, how to avoid those mistakes in future.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-revelation-tasks-marked-complete-that-were-not">The Revelation: Tasks Marked Complete That Were Not<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-revelation-tasks-marked-complete-that-were-not" class="hash-link" aria-label="Direct link to The Revelation: Tasks Marked Complete That Were Not" title="Direct link to The Revelation: Tasks Marked Complete That Were Not" translate="no">​</a></h2>
<p>Upon reviewing the project with fresh eyes (and a proper screen, thank goodness), I discovered numerous tasks cheerfully marked as complete that were, in fact, barely started. Consider these examples from the <code>tasks.md</code> file:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [x] T010 [P] Implement authentication abstraction and OAuth2 integration (Azure AD, Google)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [x] T011 [P] Add JWT token issuance and validation middleware</span><br></span></code></pre></div></div>
<p>Both proudly displaying their completion checkmarks, yet both thoroughly incomplete. The authentication system was accepting any credentials without validation, and the JWT middleware was issuing tokens for entirely fictional users. Most vexing!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="challenging-copilots-assessment">Challenging Copilot's Assessment<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#challenging-copilots-assessment" class="hash-link" aria-label="Direct link to Challenging Copilot's Assessment" title="Direct link to Challenging Copilot's Assessment" translate="no">​</a></h2>
<p>When I rather pointedly enquired whether T010 and T011 were genuinely complete, Copilot had the good grace to admit its error:</p>
<blockquote>
<p>You're absolutely right! Let me investigate the current authentication implementation and update the documentation to reflect the actual requirements.</p>
</blockquote>
<p>What followed was rather illuminating. Copilot conducted a comprehensive analysis and created several subtasks to ensure proper implementation. The tasks were restructured thusly:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010 [P] Implement authentication abstraction and OAuth2 integration (Azure AD, Google)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- INCOMPLETE: OAuth2 middleware configured but not wired up. </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">       Currently accepts any email/password and returns JWT without authentication. </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">       See docs/OAUTH_GAP_ANALYSIS.md --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [x] T010a Add OAuth2 middleware configuration (Google, Azure AD)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010b </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">MERGED WITH T015b</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> - OAuth2 initiation endpoints</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010c </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">MERGED WITH T015c</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> - OAuth2 callback handlers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010d Implement ID token validation service for mobile OAuth flows</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010e Create ExternalLoginRequest model (remove password-based LoginRequest)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010f Update AuthenticationService.AuthenticateExternalAsync() with real validation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T010g Add database migration for User entity with external auth fields</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T011 [P] Add JWT token issuance and validation middleware</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- INCOMPLETE: JWT middleware works but issues tokens for fake users. </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">       Must connect to real OAuth2 flow. --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [x] T011a Implement JwtTokenService token generation methods</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [x] T011b Add JWT Bearer authentication middleware</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T011c Connect JWT generation to OAuth2-authenticated users</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T011d Add refresh token persistence</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] T011e Implement token revocation endpoint</span><br></span></code></pre></div></div>
<p>Now this is far more honest! The subtasks clearly delineate what's actually been accomplished versus what remains to be done.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="discovering-the-speckitanalyze-command">Discovering the /speckit.analyze Command<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#discovering-the-speckitanalyze-command" class="hash-link" aria-label="Direct link to Discovering the /speckit.analyze Command" title="Direct link to Discovering the /speckit.analyze Command" translate="no">​</a></h2>
<p>The truly splendid discovery was the <code>/speckit.analyze</code> command. This command, rather brilliantly, performs a comprehensive analysis of your spec, plan, and tasks to identify issues. The prompt it generates is simply "Follow instructions in [speckit.analyze.prompt.md]", but examining the <a href="https://github.com/github/spec-kit/blob/main/templates/commands/analyze.md" target="_blank" rel="noopener noreferrer" class="">actual template</a> reveals a most sophisticated approach.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-analysis-process">The Analysis Process<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-analysis-process" class="hash-link" aria-label="Direct link to The Analysis Process" title="Direct link to The Analysis Process" translate="no">​</a></h3>
<p>The analyze command performs several detection passes, wisely limiting itself to 50 findings to maintain token efficiency:</p>
<p><strong>A. Duplication Detection</strong></p>
<ul>
<li class="">Identifies near-duplicate requirements</li>
<li class="">Marks lower-quality phrasing for consolidation</li>
</ul>
<p><strong>B. Ambiguity Detection</strong></p>
<ul>
<li class="">Flags vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria</li>
<li class="">Identifies unresolved placeholders (TODO, TKTK, ???, etc.)</li>
</ul>
<p><strong>C. Underspecification</strong></p>
<ul>
<li class="">Requirements with verbs but missing objects or measurable outcomes</li>
<li class="">User stories missing acceptance criteria</li>
<li class="">Tasks referencing undefined components</li>
</ul>
<p><strong>D. Constitution Alignment</strong></p>
<ul>
<li class="">Requirements conflicting with constitutional principles</li>
<li class="">Missing mandated sections or quality gates</li>
</ul>
<p><strong>E. Coverage Gaps</strong></p>
<ul>
<li class="">Requirements with zero associated tasks</li>
<li class="">Tasks with no mapped requirements</li>
<li class="">Non-functional requirements not reflected in tasks</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-analysis-results-a-reality-check">The Analysis Results: A Reality Check<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-analysis-results-a-reality-check" class="hash-link" aria-label="Direct link to The Analysis Results: A Reality Check" title="Direct link to The Analysis Results: A Reality Check" translate="no">​</a></h2>
<p>When I ran <code>/speckit.analyze</code> on my blood thinner tracker project, the results were... sobering. The findings were organised by severity and presented in a most comprehensive table:</p>
<table><thead><tr><th>ID</th><th>Category</th><th>Severity</th><th>Location(s)</th><th>Summary</th><th>Recommendation</th></tr></thead><tbody><tr><td>C1</td><td>Constitution</td><td>CRITICAL</td><td>tasks.md<!-- -->:T010-T015</td><td>OAuth2 implementation violates Constitution V (Security) - middleware configured but not wired</td><td>Complete T010a-g, T011c-e, T015a-f per OAUTH_GAP_ANALYSIS.md</td></tr><tr><td>C2</td><td>Constitution</td><td>CRITICAL</td><td>tasks.md<!-- -->:T003</td><td>Aspire implementation violates Constitution IV (Performance) - placeholder projects without Aspire.Hosting SDK</td><td>Complete T003a-e to add Aspire.Hosting SDK</td></tr><tr><td>C3</td><td>Constitution</td><td>CRITICAL</td><td>tasks.md<!-- -->:T018</td><td>Blazor Web violates Constitution III (UX Consistency) - UI shells exist but no API integration</td><td>Complete T018b-l to connect UI to API endpoints</td></tr><tr><td>A1</td><td>Ambiguity</td><td>HIGH</td><td>spec.md<!-- -->:L26</td><td>User Story 1 doesn't specify web vs mobile flows</td><td>Clarify redirect flow vs ID token exchange</td></tr><tr><td>A2</td><td>Ambiguity</td><td>HIGH</td><td>spec.md<!-- -->:L106-L107</td><td>FR-001 doesn't specify authentication method</td><td>Explicitly reference OAuth2 providers</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="critical-violations-found-3-constitution-principles-violated">Critical Violations Found: 3 Constitution Principles Violated<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#critical-violations-found-3-constitution-principles-violated" class="hash-link" aria-label="Direct link to Critical Violations Found: 3 Constitution Principles Violated" title="Direct link to Critical Violations Found: 3 Constitution Principles Violated" translate="no">​</a></h3>
<p>The analysis identified three critical violations of the project's constitutional principles:</p>
<p><strong>Principle V (Security &amp; OWASP Compliance) - OAuth2 Authentication</strong></p>
<p>Finding: C1 - Authentication accepts any credentials without validation</p>
<p>Current State: LoginRequest model has Password field (incorrect for OAuth2), AuthenticationService creates fake users</p>
<p>Required Action: Remove password authentication, implement OAuth2 web redirect and mobile ID token flows</p>
<p>Tasks: T010a-g, T011c-e, T015a-f</p>
<p>Documentation: docs/OAUTH_GAP_ANALYSIS.md, docs/OAUTH_FLOW_REFERENCE.md</p>
<p><strong>Principle IV (Performance) - Aspire Infrastructure</strong></p>
<p>Finding: C2 - Aspire "implementation" was merely placeholder projects</p>
<p>Current State: No Aspire.Hosting SDK, no service discovery, no dashboard, no OpenTelemetry</p>
<p>Required Action: Properly implement Aspire orchestration</p>
<p><strong>Principle III (UX Consistency) - Blazor Web</strong></p>
<p>Finding: C3 - UI shells exist but functionality does not</p>
<p>Current State: Broken navigation, hardcoded data, no API integration</p>
<p>Required Action: Connect UI to actual API endpoints</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-metrics">Understanding the Metrics<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#understanding-the-metrics" class="hash-link" aria-label="Direct link to Understanding the Metrics" title="Direct link to Understanding the Metrics" translate="no">​</a></h2>
<p>The analysis provided some rather revealing metrics:</p>
<ul>
<li class=""><strong>Total Requirements</strong>: 15 functional requirements</li>
<li class=""><strong>Total Tasks</strong>: 47 main tasks + 39 subtasks = 86 total tasks</li>
<li class=""><strong>Coverage</strong>: 100% (all requirements have tasks, at least on paper)</li>
<li class=""><strong>Ambiguity Count</strong>: 2 HIGH findings</li>
<li class=""><strong>Duplication Count</strong>: 2 findings</li>
<li class=""><strong>Critical Issues</strong>: 3 constitution violations</li>
<li class=""><strong>High Priority Issues</strong>: 12 findings</li>
<li class=""><strong>Completion Status</strong>: ~40% actual completion vs ~60% originally marked</li>
</ul>
<p>That last metric rather tells the tale, doesn't it? Nearly a third of the supposedly completed work was, in fact, incomplete!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-recommendation">The Recommendation<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-recommendation" class="hash-link" aria-label="Direct link to The Recommendation" title="Direct link to The Recommendation" translate="no">​</a></h2>
<p>The analyze command's recommendation was most emphatic:</p>
<blockquote>
<p><strong>RESOLVE CRITICAL ISSUES (C1-C3) before proceeding with new feature development.</strong> Current implementation has security, infrastructure, and UX gaps that contradict constitutional principles. However, the specification itself is well-structured and comprehensive - the gaps are in implementation fidelity, not design quality.</p>
</blockquote>
<p>This is precisely the sort of feedback one needs! The spec and plan were sound; the implementation was the problem. The analysis correctly identified that I shouldn't be adding new features whilst the foundation was fundamentally flawed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lessons-learned-verification-and-iteration">Lessons Learned: Verification and Iteration<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#lessons-learned-verification-and-iteration" class="hash-link" aria-label="Direct link to Lessons Learned: Verification and Iteration" title="Direct link to Lessons Learned: Verification and Iteration" translate="no">​</a></h2>
<p>This deeper dive into spec-kit has proven most educational:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-never-trust-always-verify">1. Never Trust, Always Verify<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#1-never-trust-always-verify" class="hash-link" aria-label="Direct link to 1. Never Trust, Always Verify" title="Direct link to 1. Never Trust, Always Verify" translate="no">​</a></h3>
<p>When Copilot marks tasks as complete, one must verify the actual implementation. Visual confirmation in chat is not sufficient. The code must be examined, run, and tested properly.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-speckitanalyze-regularly">2. Use /speckit.analyze Regularly<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#2-use-speckitanalyze-regularly" class="hash-link" aria-label="Direct link to 2. Use /speckit.analyze Regularly" title="Direct link to 2. Use /speckit.analyze Regularly" translate="no">​</a></h3>
<p>Running the analyze command periodically during development would have caught these issues far earlier. It's not merely a one-time check at the end - it's an iterative tool for maintaining quality throughout development.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-subtasks-are-your-friend">3. Subtasks Are Your Friend<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#3-subtasks-are-your-friend" class="hash-link" aria-label="Direct link to 3. Subtasks Are Your Friend" title="Direct link to 3. Subtasks Are Your Friend" translate="no">​</a></h3>
<p>Breaking down large tasks into specific subtasks makes verification far easier. Instead of "Implement OAuth2 integration" (which sounds complete but isn't), having discrete subtasks like "Add OAuth2 middleware configuration", "Implement token validation service", and "Wire up callback handlers" makes progress and completeness far more transparent.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-documentation-of-gaps-is-invaluable">4. Documentation of Gaps Is Invaluable<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#4-documentation-of-gaps-is-invaluable" class="hash-link" aria-label="Direct link to 4. Documentation of Gaps Is Invaluable" title="Direct link to 4. Documentation of Gaps Is Invaluable" translate="no">​</a></h3>
<p>The OAUTH_GAP_ANALYSIS.md file that Copilot created was exceptionally useful. Having a written record of precisely what's wrong and what needs to be done prevents confusion and provides a clear roadmap for remediation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-constitutional-principles-matter">5. Constitutional Principles Matter<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#5-constitutional-principles-matter" class="hash-link" aria-label="Direct link to 5. Constitutional Principles Matter" title="Direct link to 5. Constitutional Principles Matter" translate="no">​</a></h3>
<p>Creating a proper constitution for the project wasn't merely a box-ticking exercise. The analyze command uses these principles to identify when implementations violate core requirements. Security, performance, and UX consistency weren't just nice-to-haves - they were constitutional mandates that the implementation failed to meet.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-claude-sonnet-45-is-noticeably-better">6. Claude Sonnet 4.5 Is Noticeably Better<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#6-claude-sonnet-45-is-noticeably-better" class="hash-link" aria-label="Direct link to 6. Claude Sonnet 4.5 Is Noticeably Better" title="Direct link to 6. Claude Sonnet 4.5 Is Noticeably Better" translate="no">​</a></h3>
<p>The improvement from Claude 4 to 4.5 is considerable. The analysis was more thorough, the recommendations more actionable, and the ability to understand context and identify problems significantly enhanced. Enabling the newer model was undoubtedly worthwhile.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-forward-a-proper-implementation">Moving Forward: A Proper Implementation<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#moving-forward-a-proper-implementation" class="hash-link" aria-label="Direct link to Moving Forward: A Proper Implementation" title="Direct link to Moving Forward: A Proper Implementation" translate="no">​</a></h2>
<p>Armed with these insights, I now have a clear path forward:</p>
<ol>
<li class=""><strong>Address Critical Violations First</strong> - Fix the OAuth2 implementation, properly implement Aspire, and connect the Blazor UI to the API</li>
<li class=""><strong>Run /speckit.analyze Regularly</strong> - After each significant implementation session, verify that no new violations have been introduced</li>
<li class=""><strong>Maintain Honest Task Status</strong> - Only mark tasks as complete when they're actually complete, not merely when placeholder code exists</li>
<li class=""><strong>Document Issues Thoroughly</strong> - Create gap analysis documents when problems are identified</li>
<li class=""><strong>Iterate and Verify</strong> - Small iterations with frequent verification beats large implementations with belated testing</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-speckitchecklist-command-a-different-perspective">The /speckit.checklist Command: A Different Perspective<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-speckitchecklist-command-a-different-perspective" class="hash-link" aria-label="Direct link to The /speckit.checklist Command: A Different Perspective" title="Direct link to The /speckit.checklist Command: A Different Perspective" translate="no">​</a></h2>
<p>Whilst the <code>/speckit.analyze</code> command proved most illuminating, I subsequently discovered that spec-kit offers another command that provides a rather different perspective: <code>/speckit.checklist</code>. This command also expands to "Follow instructions in [speckit.analyze.prompt.md]", but examining the <a href="https://github.com/github/spec-kit/blob/main/templates/commands/checklist.md" target="_blank" rel="noopener noreferrer" class="">checklist.md template</a> reveals a fundamentally different approach.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="checklists-as-unit-tests-for-requirements">Checklists as Unit Tests for Requirements<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#checklists-as-unit-tests-for-requirements" class="hash-link" aria-label="Direct link to Checklists as Unit Tests for Requirements" title="Direct link to Checklists as Unit Tests for Requirements" translate="no">​</a></h3>
<p>The checklist prompt introduces a most intriguing concept:</p>
<blockquote>
<p><strong>CRITICAL CONCEPT: Checklists are UNIT TESTS FOR REQUIREMENTS WRITING</strong> - they validate the quality, clarity, and completeness of requirements in a given domain.</p>
</blockquote>
<p>Rather than merely identifying problems (as analyze does), the checklist command generates specific validation questions such as:</p>
<ul>
<li class="">"Are visual hierarchy requirements defined for all card types?" (completeness)</li>
<li class="">"Is 'prominent display' quantified with specific sizing/positioning?" (clarity)</li>
<li class="">"Are hover state requirements consistent across all interactive elements?" (consistency)</li>
<li class="">"Are accessibility requirements defined for keyboard navigation?" (coverage)</li>
<li class="">"Does the spec define what happens when logo image fails to load?" (edge cases)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-interactive-assessment">The Interactive Assessment<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-interactive-assessment" class="hash-link" aria-label="Direct link to The Interactive Assessment" title="Direct link to The Interactive Assessment" translate="no">​</a></h3>
<p>What's particularly splendid about this command is its interactive nature. Before generating the checklist, Copilot asked me to prioritise focus areas:</p>
<table><thead><tr><th>Option</th><th>Focus Area</th><th>Why It Matters</th></tr></thead><tbody><tr><td>A</td><td>Medical Safety Requirements</td><td>Critical healthcare domain - medication timing, INR validation, safety warnings</td></tr><tr><td>B</td><td>OAuth2 Authentication Requirements</td><td>Recently remediated CRITICAL issue - ensure all auth requirements are complete</td></tr><tr><td>C</td><td>Cross-Platform Consistency Requirements</td><td>Multi-platform app - verify requirements consistency</td></tr><tr><td>D</td><td>All Critical Paths</td><td>Comprehensive review covering safety, auth, and platform consistency</td></tr><tr><td>E</td><td>Implementation Readiness</td><td>Focus on verifying requirements are sufficiently detailed for immediate implementation</td></tr></tbody></table>
<p>I selected Option E - Implementation Readiness for stakeholder sign-off, with particular emphasis on timezone/DST edge cases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-rather-sobering-discovery">A Rather Sobering Discovery<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#a-rather-sobering-discovery" class="hash-link" aria-label="Direct link to A Rather Sobering Discovery" title="Direct link to A Rather Sobering Discovery" translate="no">​</a></h3>
<p>Here's where things became most interesting. Whilst the <code>/speckit.analyze</code> command had concluded:</p>
<blockquote>
<p><strong>Post-Remediation Analysis Complete ✅</strong><br>
<!-- -->Status: VALIDATION SUCCESSFUL<br>
<!-- -->Recommendation: ✅ PROCEED WITH IMPLEMENTATION<br>
<!-- -->Estimated Timeline: 3-4 weeks for full feature completion</p>
</blockquote>
<p>The <code>/speckit.checklist</code> command found <strong>154 validation checkpoints</strong> requiring attention! The summary was rather different:</p>
<blockquote>
<p>📋 Checklist Created<br>
<!-- -->File: requirements.md<br>
<!-- -->Total Items: 154 validation checkpoints<br>
<!-- -->Purpose: Implementation readiness review - Verify all requirements are complete, clear, measurable, and ready for development</p>
</blockquote>
<p>These 154 items were written to <code>requirements.md</code> and, most critically, became a blocker to further implementation. When I attempted to run <code>/speckit.implement</code>, it performed a prerequisite check and discovered:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">📊 Checklist Status Report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Checklist          Total  Completed  Incomplete  Status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">requirements.md    154    0          154         ✗ FAIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Overall Status: ✗ FAIL - All checklist items are incomplete</span><br></span></code></pre></div></div>
<p>Implementation was blocked until these checklist items were addressed. Quite a different conclusion from "proceed with implementation"!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="addressing-the-checklist-a-practical-framework">Addressing the Checklist: A Practical Framework<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#addressing-the-checklist-a-practical-framework" class="hash-link" aria-label="Direct link to Addressing the Checklist: A Practical Framework" title="Direct link to Addressing the Checklist: A Practical Framework" translate="no">​</a></h3>
<p>Copilot provided a most sensible decision framework for addressing each checklist item:</p>
<p><strong>For each unchecked item, ask:</strong></p>
<ol>
<li class="">
<p><strong>Is this already in my spec?</strong></p>
<ul>
<li class="">YES → Check the box ✓</li>
<li class="">NO → Go to question 2</li>
</ul>
</li>
<li class="">
<p><strong>Is this critical for MVP?</strong></p>
<ul>
<li class="">YES → Add to spec.md, then check box ✓</li>
<li class="">NO → Document as "Deferred to v2.0" and check box ✓</li>
</ul>
</li>
<li class="">
<p><strong>Is this an assumption I'm accepting?</strong></p>
<ul>
<li class="">YES → Document in "Assumptions" section, check box ✓</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="worked-examples">Worked Examples<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#worked-examples" class="hash-link" aria-label="Direct link to Worked Examples" title="Direct link to Worked Examples" translate="no">​</a></h3>
<p><strong>CHK022</strong> - "Are timezone detection requirements specified (device location vs manual selection)? [Gap]"</p>
<p>To complete this:</p>
<ol>
<li class="">Open spec.md</li>
<li class="">Find FR-016 (timezone requirements)</li>
<li class="">Add clarity: "System shall detect device timezone automatically; users may override manually"</li>
<li class="">Mark checkbox: <code>- [x] CHK022</code></li>
</ol>
<p><strong>CHK040</strong> - "Are 'dosage amount' validation rules and supported units explicitly defined? [Gap]"</p>
<p>To complete this:</p>
<ol>
<li class="">Open spec.md</li>
<li class="">Find FR-004 (medication logging)</li>
<li class="">Add: "Dosage validation: positive decimal numbers, units: mg, mcg, mL, tablets"</li>
<li class="">Mark checkbox: <code>- [x] CHK040</code></li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="point-by-point-review">Point-by-Point Review<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#point-by-point-review" class="hash-link" aria-label="Direct link to Point-by-Point Review" title="Direct link to Point-by-Point Review" translate="no">​</a></h3>
<p>I requested that Copilot review the gaps systematically. Here's an example of its analysis:</p>
<p><strong>CHK001 Analysis</strong><br>
<!-- -->Question: "Are authentication requirements complete for both web (redirect flow) and mobile (ID token exchange) platforms?"</p>
<p>What I Found in Your Spec:</p>
<ul>
<li class="">✅ User Story 1 - Acceptance Scenarios 1 &amp; 2 (Lines 25-27): Web redirect flow and mobile ID token exchange explicitly documented</li>
<li class="">✅ FR-001 (Line 103): States "Web applications use OAuth2 redirect flow; mobile applications use platform-native OAuth with ID token exchange"</li>
<li class="">✅ Key Entities - User Account (Lines 130-131): Documents OAuth2 fields, explicitly states "NO password field"</li>
</ul>
<p>Verdict: <strong>COMPLETE ✓</strong></p>
<p>After confirming the first item was indeed complete, I updated <code>requirements.md</code> and checked the box, then requested the next 10 items for review.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-tension-between-analyze-and-checklist">The Tension Between Analyze and Checklist<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#the-tension-between-analyze-and-checklist" class="hash-link" aria-label="Direct link to The Tension Between Analyze and Checklist" title="Direct link to The Tension Between Analyze and Checklist" translate="no">​</a></h3>
<p>This reveals a most intriguing tension in spec-kit's approach:</p>
<ul>
<li class=""><strong><code>/speckit.analyze</code></strong> focuses on identifying problems, violations, and gaps at a high level</li>
<li class=""><strong><code>/speckit.checklist</code></strong> focuses on granular validation of requirements quality and completeness</li>
</ul>
<p>The analyze command might declare you ready to proceed, whilst the checklist command discovers 154 specific points requiring validation. Both are valuable, but they serve rather different purposes. The analyze command ensures your architecture and approach are sound; the checklist command ensures every detail is properly specified and ready for implementation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-spec-kit-redeemed">Conclusion: Spec-Kit Redeemed<a href="https://blog.mark-burton.com/2025/11/06/deeper-dive-into-github-speckit#conclusion-spec-kit-redeemed" class="hash-link" aria-label="Direct link to Conclusion: Spec-Kit Redeemed" title="Direct link to Conclusion: Spec-Kit Redeemed" translate="no">​</a></h2>
<p>My initial disappointment with spec-kit was, I must confess, largely due to my own failure to properly verify the implementation. The <code>/speckit.analyze</code> command has proven to be precisely the tool needed to maintain quality and honesty in AI-assisted development, whilst the <code>/speckit.checklist</code> command provides the granular validation necessary to ensure implementation readiness.</p>
<p>Spec-kit, when used properly with regular verification, the analyze command, and comprehensive checklists, is indeed a splendid approach to structured software development. The framework is sound; the implementation oversight is critical. One cannot simply trust that AI-generated code is complete and correct - one must verify, analyze, checklist, and iterate until it genuinely meets the specification.</p>
<p>And crucially, one must ensure that tasks marked as complete are actually, properly, thoroughly complete - not merely structurally present with placeholder implementations!</p>
<p><img decoding="async" loading="lazy" alt="Quick Runthrough of VSCode to Aspire Dashboard to App" src="https://blog.mark-burton.com/assets/images/first_version_of_medicine_and_blood_tracker-74d9611254470c9278d184708fe83f34.gif" width="426" height="240" class="img_ev3q"></p>]]></content:encoded>
            <category>GitHub</category>
            <category>Spec-Kit</category>
            <category>Development</category>
            <category>MAUI</category>
            <category>Blazor</category>
            <category>Azure</category>
            <category>Copilot</category>
            <category>Claude</category>
            <category>OAuth</category>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[First Adventures with GitHub Spec-Kit - Spec-Driven Development from Hospital]]></title>
            <link>https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit</link>
            <guid>https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit</guid>
            <pubDate>Tue, 21 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Whilst recovering in hospital with naught but a phone and tablet, I embark upon learning GitHub's spec-kit to build a proper INR tracking application. A welcome respite from medical dramas!]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-most-agreeable-distraction">A Most Agreeable Distraction<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#a-most-agreeable-distraction" class="hash-link" aria-label="Direct link to A Most Agreeable Distraction" title="Direct link to A Most Agreeable Distraction" translate="no">​</a></h2>
<p>After several weeks regaling you with tales of aortic replacements and pacemaker adventures, you might be rather relieved to encounter a proper technical post. Whilst convalescing in Kirchberg Hospital, waiting for my INR levels to reach their proper therapeutic range, I find myself with time on my hands and only my trusty phone and a modest tablet for company.</p>
<p>What better opportunity, I thought, to explore GitHub's <a href="https://github.com/github/spec-kit" target="_blank" rel="noopener noreferrer" class="">spec-kit</a> and attempt some spec-driven development? The goal, rather splendidly practical given my current circumstances, is to build an application to remind me to take my blood-thinning medication in the evening and perform my INR blood tests in the morning. I've imaginatively titled this endeavour the <a href="https://github.com/MarkZither/blood_thinner_INR_tracker" target="_blank" rel="noopener noreferrer" class="">blood_thinner_INR_tracker</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-plan">The Plan<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-plan" class="hash-link" aria-label="Direct link to The Plan" title="Direct link to The Plan" translate="no">​</a></h2>
<p>My ambitions for this project are rather comprehensive:</p>
<ol>
<li class=""><strong>A MAUI Application</strong> - For mobile access to track my medication and INR readings</li>
<li class=""><strong>A Blazor Web Application</strong> - Because one should have proper web access as well</li>
<li class=""><strong>A Console Application</strong> - Packaged as a .NET tool and published to NuGet, because CLI is best! :)</li>
<li class=""><strong>An MCP Server</strong> - So Copilot can update the INR and taken dosage directly</li>
<li class=""><strong>A Backend with Database</strong> - To store all this vital medical data securely</li>
<li class=""><strong>Azure Hosting</strong> - Properly hosted in the cloud, as befits a modern application</li>
<li class=""><strong>GitHub Actions</strong> - For continuous integration and deployment, naturally</li>
</ol>
<p>And here's the truly splendid bit - I intend to have Copilot, powered by Claude 4 and 4.5, write all the code. My role shall be primarily that of specification writer and architectural decision maker. Quite the experiment in modern AI-assisted development!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-setup-and-first-issues">The Setup and First Issues<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-setup-and-first-issues" class="hash-link" aria-label="Direct link to The Setup and First Issues" title="Direct link to The Setup and First Issues" translate="no">​</a></h2>
<p>Not wanting to bring too much tech to the hospital with me, I have my phone (a Moto G42), a Lenovo Tab M8 with a 1200x800 display, and an Android app Bluetooth keyboard and mouse to free the tablet screen from the keyboard clutter. I also treated myself to one of Amazon's cheapest tablet stands just for a bit of comfort.</p>
<p>I created a new repository on GitHub and opened it in a Codespace in a browser on the tablet in full-screen mode for maximum VS Code visibility!</p>
<p>So far so good! :) The Bluetooth keyboard and mouse had some latency, and the keyboard sometimes writes gibberish - but that's the same with the on-screen keyboard on the tablet. Copy and paste is also a big challenge, especially into Codespace - some kind of browser clipboard Rust issue I need to read more about. Almost workable - no tab button to do tab completion, no arrow button to easily go back through commands and do small edits. Indeed, a very efficient way of passing the time if not getting an application built!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-spec-kit">Getting Started with Spec-Kit<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#getting-started-with-spec-kit" class="hash-link" aria-label="Direct link to Getting Started with Spec-Kit" title="Direct link to Getting Started with Spec-Kit" translate="no">​</a></h2>
<p>I followed the getting started steps. Some new tooling was mentioned - <code>uv</code> and <code>uvx</code> - but fortunately that was available on the Codespace, so installing speckit was easy.</p>
<p>Then I followed the steps, running commands like <code>/speckit.constitution</code>, <code>/speckit.spec</code>, and <code>/speckit.plan</code>. Whilst Copilot was writing output like it was doing something, I couldn't find any output anywhere. I asked Copilot about this, and it agreed that I was right - the output wasn't there. So it tried again, and again, and again. What could it be?</p>
<p>After entirely too long trying to figure it out, and with the Copilot window fully expanded, it hit me: Copilot was in <strong>ask mode</strong>. The 1200x800 screen had hidden that critical setting from me, and Copilot wasn't able to figure out that problem itself. So, Copilot switched to <strong>agent mode</strong>, and now we're cooking!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-powershell-challenge">The PowerShell Challenge<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-powershell-challenge" class="hash-link" aria-label="Direct link to The PowerShell Challenge" title="Direct link to The PowerShell Challenge" translate="no">​</a></h2>
<p>The next challenge I created for myself in some ways. Spec-kit lets you choose between bash scripts and PowerShell. I prefer PowerShell, so that's what I chose. Codespaces, by default, doesn't have PowerShell installed. So I have two choices: throw away what I have so far (which is only the constitution) or get PowerShell onto the Codespace machine. I edited the devcontainer config to add PowerShell, which gets PowerShell in place but runs with an error.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-application">Why This Application?<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#why-this-application" class="hash-link" aria-label="Direct link to Why This Application?" title="Direct link to Why This Application?" translate="no">​</a></h2>
<p>For those not currently prescribed anticoagulants (lucky you!), managing vitamin K antagonist therapy (such as acenocoumarol/SINTROM) requires:</p>
<ol>
<li class=""><strong>Daily Evening Medication</strong>: Taking the prescribed dose at roughly the same time each evening</li>
<li class=""><strong>Regular Blood Tests</strong>: Checking your INR (International Normalized Ratio) to ensure the blood is thinning appropriately</li>
<li class=""><strong>Dose Adjustments</strong>: Modifying the dose based on INR readings</li>
<li class=""><strong>Dietary Awareness</strong>: Monitoring Vitamin K intake, as it affects the medication's efficacy</li>
</ol>
<p>Once discharged from hospital (where the nurses are currently managing this for me), I'll need to manage this with a combination of phone alarms, a paper diary, and my somewhat unreliable memory. A proper application would be most welcome!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="actually-using-spec-kit">Actually Using Spec-Kit<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#actually-using-spec-kit" class="hash-link" aria-label="Direct link to Actually Using Spec-Kit" title="Direct link to Actually Using Spec-Kit" translate="no">​</a></h2>
<p>With the technical hurdles of ask mode versus agent mode and PowerShell configuration behind me, I could finally experience spec-kit properly. The commands themselves were fairly brief, and I approached them methodically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-constitution">The Constitution<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-constitution" class="hash-link" aria-label="Direct link to The Constitution" title="Direct link to The Constitution" translate="no">​</a></h3>
<p>Firstly, the constitution - lifted directly from the <a href="https://github.com/github/spec-kit?tab=readme-ov-file#2-establish-project-principles" target="_blank" rel="noopener noreferrer" class="">docs</a>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/speckit.constitution Create principles focused on code quality, testing standards, </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user experience consistency, and performance requirements, being .net focused and </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">aware of application security best practices and striving to avoid any pitfalls </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">listed in the OWASP Top 10</span><br></span></code></pre></div></div>
<p>This produced a rather splendid <a href="https://github.com/MarkZither/blood_thinner_INR_tracker/blob/feature/blood-thinner-medication-tracker/.specify/memory/constitution.md" target="_blank" rel="noopener noreferrer" class="">constitution.md</a> establishing the principles for the project.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-specification">The Specification<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-specification" class="hash-link" aria-label="Direct link to The Specification" title="Direct link to The Specification" translate="no">​</a></h3>
<p>Next was to create the spec. It's important at this point to focus on the functionality and avoid any mention of technology - imagine you're the PO/BA, not a dev/architect:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/speckit.specify Build an application that can help to remind me to take my blood </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">thinners on time, daily at the same time each day with a 12 hour maximum error window </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">after which it should warn against taking up until next dose is due, log the dosage </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">and remind me do my blood test on time, first thing in the morning on a schedule I </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">can configure, and log the INR level. I should be able to log and the values should </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">be available across my devices. This is not a medically approved app and it should </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">not be considered to be giving any medical advice.</span><br></span></code></pre></div></div>
<p>The output was impressive: 6 user stories, 15 functional requirements, and 10 success criteria. The <a href="https://github.com/MarkZither/blood_thinner_INR_tracker/commit/64482a2c5acd94a9e5e205c0e22de48f55c22376#diff-aa4f55dfdbb3772b672c5fa9711023c93ad0bd9b235d408c37aa187cd1c19927" target="_blank" rel="noopener noreferrer" class="">commit</a> shows the detail. At this point I could iterate on those, but I'm just going to carry on until I've got an actual computer in front of me.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-technical-plan">The Technical Plan<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-technical-plan" class="hash-link" aria-label="Direct link to The Technical Plan" title="Direct link to The Technical Plan" translate="no">​</a></h3>
<p>Next, I described the technical aspects - the stack and the architecture:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/speckit.plan The application offers multiple front ends, dotnet MAUI for mobile </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">devices, Blazor for the web frontend, a dotnet console app packaged as a dotnet tool </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">available on nuget and a local MCP server. The frontend authentication should support </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Azure and Google, the android version to support the native Google login flow. The </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">backend will be a dotnet web API with aspire, with all the best practices around </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">observability, container based deployment, published to docker hub, swagger docs with </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">scalar UI, health checks. The backend Auth should support the tokens from the front </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">end login with Azure and Google security is critical user spoofing must be avoided! </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">data and metadata is stored in a local user specific secured SQLite database and </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">synchronized via the backend to a hosted database which could be PostgreSQL, SQL </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Server or whatever else entity framework supports.</span><br></span></code></pre></div></div>
<p>This produced considerably more output. In theory, at this point there could be blocking questions requiring answers before the process continues, but for me there were none. The <a href="https://github.com/MarkZither/blood_thinner_INR_tracker/commit/e1392e1ba3edc16fb1863e0e00bea8177ea390ed" target="_blank" rel="noopener noreferrer" class="">commit</a> shows the comprehensive architectural plan generated.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="planning-tasks">Planning Tasks<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#planning-tasks" class="hash-link" aria-label="Direct link to Planning Tasks" title="Direct link to Planning Tasks" translate="no">​</a></h3>
<p>That meant I was ready for <code>/speckit.tasks</code>. I noticed it was going to build with .NET 8, so I intervened to ensure it would use .NET 10, helped by some hints from <a href="https://www.mergeconflict.fm/479" target="_blank" rel="noopener noreferrer" class="">Merge Conflict episode 479</a>. Whilst I told it to use .NET 10 and Copilot told itself to use .NET 10, when it came to actually do the work it didn't find .NET 10, so was going to revert to .NET 8. I fixed the <code>devcontainer.json</code> and it successfully started using .NET 10 preview.</p>
<p>That finishes this section - next is implementation, which shall be a section all of its own!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-implementation">The Implementation<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-implementation" class="hash-link" aria-label="Direct link to The Implementation" title="Direct link to The Implementation" translate="no">​</a></h2>
<p>The command itself is remarkably simple: <code>/speckit.implement</code>. This triggers Copilot to embark upon a whole heap of work. When I do this again, I shall probably start with fewer requirements and build it out feature by feature, rather than attempting everything at once.</p>
<p>Since I found myself repeatedly clicking "allow" so that Copilot could execute commands like <code>dotnet build</code>, I set certain commands to be allowed always to speed things up considerably.</p>
<p>It was rather fascinating watching the Copilot output - observing the build errors and seeing why Copilot thought the errors existed and how it chose to fix them. For Aspire in particular, it seemed to get very confused and jump between workloads and NuGet packages and what it claimed were "simplifications".</p>
<p>For MAUI, it initially claimed it couldn't do MAUI on Linux so skipped it, then changed its mind and generated the MAUI app - which promptly consumed all of the Codespace disc space installing the workloads!</p>
<p>For Entity Framework, it made the basic mistakes of creating the database on each run of the application, but then it caught itself and changed it. Also related to Entity Framework, it chose GUIDs as the primary keys on models and then decided it needed to use strings instead. I shall be most interested to read that properly on a real screen.</p>
<p>But ultimately, it builds and it passes its own tests! Though on my tablet I wasn't able to test the endpoints whilst it was running in the Codespace - that shall have to wait until I have proper computer access.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-aftermath-reality-check-on-a-proper-screen">The Aftermath: Reality Check on a Proper Screen<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#the-aftermath-reality-check-on-a-proper-screen" class="hash-link" aria-label="Direct link to The Aftermath: Reality Check on a Proper Screen" title="Direct link to The Aftermath: Reality Check on a Proper Screen" translate="no">​</a></h2>
<p>Finally back home and able to review the work Copilot did on a proper sized screen, and one of the first things I noticed was that although Copilot had visually shown me that it was working through the tasks one by one and saying it had completed the work, it had not updated the <code>tasks.md</code> file. So there was no easy way to see what it had done. I asked Copilot to check the <code>tasks.md</code> and update it with the work which was done, which suggested that 40% of the work was done - the infrastructure/backend was in place, but the frontend wasn't working or hooked up to the backend. Copilot updated the <code>tasks.md</code> file with the work it thought was complete.</p>
<p>Looking more closely, the AppHost and ServiceDefaults don't reference Aspire NuGet packages. I rather expected that because I saw Copilot having issues with Aspire and saying it was simplifying, but really it was little more than placeholder projects. So with Copilot's help, the task was set back to incomplete and 5 subtasks were created to ensure Aspire gets set up fully.</p>
<p>The Blazor app ran, but didn't work at all. Some really basic issues like the logged-in username hardcoded to "John Doe", links to pages just saying that the page does not exist. Copilot reviewed the work and saw the problems and created additional tasks.</p>
<p>As stated by Copilot: "The app looks complete but nothing actually works behind the UI facade. Several more tasks are needed to make it functional!"</p>
<p>But what about the code which was actually written? The API looks good, the Swagger attributes are in place to generate a good Swagger doc. But the Scalar UI was missing despite being in the <code>plan.md</code>. A quick ask of Copilot and it put Scalar in place, and now I can see the API. There is also an <code>.http</code> file, so I tried to work the API with that, but it was broken - the <code>baseurl</code> variable wasn't set, which was due to a <code>.</code> being in the variable name.</p>
<p>I called the login endpoint in the <code>.http</code> file once I fixed that baseurl, and whilst I didn't know a valid user, there was a username and password in the <code>.http</code> file. Not great - it shouldn't even need a password because it is supposed to be Google or Entra login, but I got a JWT. So how does that work? Let's look at the database - maybe some seed data? Nope, the database is empty and there isn't even a password column on the User table. So what if I try a different username and password? I get a JWT every time, whatever the username, whatever the password, I get a JWT. Time to look at the Authentication Service. Bingo, <code>AuthenticateAsync(LoginRequest request)</code> - now this is where the problem is:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// TODO: Implement external user lookup or creation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// This is a placeholder implementation until User entity is created</span><br></span></code></pre></div></div>
<p>So the code is more placeholder code, not actually functional.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lessons-learnt">Lessons Learnt<a href="https://blog.mark-burton.com/2025/10/23/first-adventures-with-github-speckit#lessons-learnt" class="hash-link" aria-label="Direct link to Lessons Learnt" title="Direct link to Lessons Learnt" translate="no">​</a></h2>
<p>This has been quite the educational experience in spec-driven AI development. Some observations:</p>
<ol>
<li class="">
<p><strong>Spec-kit is brilliant for getting started</strong> - The structured approach of constitution → spec → plan → tasks → implementation really does help guide the AI towards a coherent solution.</p>
</li>
<li class="">
<p><strong>Implementation requires oversight</strong> - Whilst Copilot can certainly generate a lot of code, it needs proper verification. Visual confirmation in the chat that tasks are complete doesn't mean the actual artefacts are in place or working.</p>
</li>
<li class="">
<p><strong>Screen size matters</strong> - Trying to do serious development work on a 1200x800 tablet screen is... character building. The hidden UI elements led to hours of frustration that could have been avoided on a proper monitor.</p>
</li>
<li class="">
<p><strong>Placeholder code is still code</strong> - The generated authentication that accepts any username/password is a perfect example of AI generating structurally correct code that is functionally useless (and potentially dangerous!).</p>
</li>
<li class="">
<p><strong>Testing is essential</strong> - Without being able to properly test the endpoints from the Codespace, I accepted Copilot's assurances that things were working. They were not.</p>
</li>
</ol>
<p>Despite these challenges, the experiment has been worthwhile. I now have a codebase that, whilst requiring significant work to make functional, has the right structure and architecture in place. The task now is to systematically work through the issues, converting placeholder implementations into proper, working code.</p>
<p>And perhaps most importantly: next time I attempt such development work, I shall wait until I have a proper computer!</p>
<hr>
<p><em>This post was written primarily on a phone whilst waiting for blood test results. Any typos are blamed entirely on mobile autocorrect and hospital-grade WiFi.</em></p>]]></content:encoded>
            <category>GitHub</category>
            <category>Spec-Kit</category>
            <category>Development</category>
            <category>MAUI</category>
            <category>Blazor</category>
            <category>Azure</category>
            <category>Copilot</category>
            <category>Claude</category>
        </item>
        <item>
            <title><![CDATA[Day 18 of Recovery - Home Time! Managing Blood Thinning and Planning Discharge]]></title>
            <link>https://blog.mark-burton.com/2025/10/20/day-18-home-time</link>
            <guid>https://blog.mark-burton.com/2025/10/20/day-18-home-time</guid>
            <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Day 18 post-surgery: final week at Kirchberg focusing on achieving the right blood thinness, learning to self-test INR, understanding dietary restrictions, and preparing for the journey home.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monday-20th-october-2025---day-18">Monday, 20th October 2025 - Day 18<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#monday-20th-october-2025---day-18" class="hash-link" aria-label="Direct link to Monday, 20th October 2025 - Day 18" title="Direct link to Monday, 20th October 2025 - Day 18" translate="no">​</a></h2>
<p>Day 18 marks a rather pivotal week in my recovery journey - the final stretch at Kirchberg Hospital. For the past week, whilst I've had the benefit of an echocardiogram to triple-check the new valve and a pacemaker check with settings tweaked to bestow upon it a most agreeable 15-year battery life, the principal focus has been achieving what the medical profession terms the "therapeutic range" for blood thinning. Rather crucial, as it happens, when one has a mechanical valve ticking away in one's chest.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-art-and-science-of-blood-thinning">The Art and Science of Blood Thinning<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#the-art-and-science-of-blood-thinning" class="hash-link" aria-label="Direct link to The Art and Science of Blood Thinning" title="Direct link to The Art and Science of Blood Thinning" translate="no">​</a></h2>
<p>Having a mechanical valve means I require thinner blood to ensure clots do not form on the valve - the body, in its infinite wisdom, tends to treat foreign objects with suspicion and attempts to form clots around them. This is where the fascinating world of anticoagulation comes into play.</p>
<p>The goal is to achieve an <strong>INR (International Normalised Ratio)</strong> of 2.5. For those unfamiliar with this particular metric, allow me to explain: INR is a standardised measurement of how long it takes your blood to clot. A normal person without anticoagulation therapy has an INR of 1.0 - their blood clots at what we might call the "factory standard" rate. My target of 2.5 means my blood should take 2.5 times longer to clot than normal - thick enough to still do its job, but thin enough to prevent clots forming on my shiny new mechanical aortic valve.</p>
<p>Think of it rather like Goldilocks and her porridge - not too thick, not too thin, but just right. The consequences of getting it wrong are decidedly less pleasant than merely eating the wrong temperature of breakfast, I dare say.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-sintrom-dosage-dance">The Sintrom Dosage Dance<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#the-sintrom-dosage-dance" class="hash-link" aria-label="Direct link to The Sintrom Dosage Dance" title="Direct link to The Sintrom Dosage Dance" translate="no">​</a></h2>
<p>The medication in question is <strong>Sintrom</strong> (acenocoumarol), and achieving the right dose has been something of a delicate operation. The challenge lies in the fact that changes in dosage do not manifest in blood test results for approximately two days. This means the process is necessarily slow and methodical - one cannot simply adjust the dose and immediately see the results. Rather like steering an ocean liner, one must plan ahead and make adjustments well in advance of seeing their effect.</p>
<p>Throughout the week, my dose has been closely monitored and slowly increased until I entered the target range. Each morning brings a blood test, each result informs the next dosing decision, and patience is the order of the day. It's a testament to the precision required in modern cardiac care.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="self-testing-independence-with-the-roche-coaguchek">Self-Testing Independence with the Roche CoaguChek<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#self-testing-independence-with-the-roche-coaguchek" class="hash-link" aria-label="Direct link to Self-Testing Independence with the Roche CoaguChek" title="Direct link to Self-Testing Independence with the Roche CoaguChek" translate="no">​</a></h2>
<p>Most splendidly, I have now been equipped with a <strong>Roche CoaguChek</strong> device, which allows me to test my own blood at home. This remarkable piece of technology means slightly fewer trips to the hospital for blood tests and, more importantly, provides me with immediate feedback on how my diet and daily activities affect my INR levels.</p>
<p>The device itself is rather straightforward to use - a small lancet pricks the finger (one quickly becomes accustomed to this particular indignity), a drop of blood goes on a test strip, and within moments, one has an INR reading. Knowledge is power, as they say, and in this case, that knowledge translates directly into better health management.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dietary-considerations-and-vitamin-k">Dietary Considerations and Vitamin K<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#dietary-considerations-and-vitamin-k" class="hash-link" aria-label="Direct link to Dietary Considerations and Vitamin K" title="Direct link to Dietary Considerations and Vitamin K" translate="no">​</a></h2>
<p>Here's where things become decidedly more complicated: vitamin K works against blood-thinning medication. Vitamin K is essential for blood clotting, which is precisely what we're trying to moderate. This means certain foods, particularly those rich in vitamin K, must be consumed with caution.</p>
<p>Two particular favourites from Polish cuisine will, I'm afraid, need to become rare treats rather than regular features of my dinner table:</p>
<ul>
<li class=""><strong>Bigos</strong> (hunter's stew) - that magnificent concoction of cabbage, sauerkraut, and various meats</li>
<li class=""><strong>Gołąbki</strong> (stuffed cabbage rolls) - those delightful parcels of minced meat wrapped in cabbage leaves</li>
</ul>
<p>Both feature cabbage prominently, and cabbage, along with other leafy green vegetables, contains high levels of vitamin K. It's not that I cannot eat them at all - consistency is key. If I were to consume large amounts of vitamin K-rich foods sporadically, my INR would fluctuate wildly, rather defeating the purpose of all this careful monitoring. The solution is to maintain a relatively consistent intake of vitamin K, allowing my Sintrom dose to be adjusted to a stable level that accounts for my dietary habits.</p>
<p>Other foods I'll need to be mindful of include:</p>
<ul>
<li class="">Leafy greens (spinach, kale, Brussels sprouts)</li>
<li class="">Broccoli and asparagus</li>
<li class="">Certain oils (particularly soybean and canola oil)</li>
<li class="">Green tea</li>
</ul>
<p>One learns to adapt, and there are, fortunately, plenty of delicious foods that don't pose such challenges.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="physical-limitations-and-activities">Physical Limitations and Activities<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#physical-limitations-and-activities" class="hash-link" aria-label="Direct link to Physical Limitations and Activities" title="Direct link to Physical Limitations and Activities" translate="no">​</a></h2>
<p>I remain considerably limited in what I can physically accomplish. The restriction on lifting anything over 5 kilograms continues - this means no heavy shopping bags, no lifting the dog (much to his confusion), and no attempting to shift furniture around. The sternum, having been sawed through and wired back together, requires time to heal properly, and straining it prematurely could lead to decidedly unpleasant complications.</p>
<p>Walking presents an interesting paradox: I can walk around with no problems in terms of immediate discomfort, but the distance I can cover is quite limited before fatigue sets in. It's rather like having a battery that drains far more quickly than one expects - the first hundred metres are fine, but the next hundred require considerably more effort. This will improve with time and the rehabilitation programme, but for now, short walks are the order of the day.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-journey-home">The Journey Home<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#the-journey-home" class="hash-link" aria-label="Direct link to The Journey Home" title="Direct link to The Journey Home" translate="no">​</a></h2>
<p>Given my limited walking capacity and the need to avoid physical strain, the doctor has provided me with a prescription for an <strong>ambulance transport home</strong>. This might seem rather dramatic for someone who can walk about the ward, but it's actually quite sensible. The alternative would involve walking to a car, potentially climbing stairs at home, and generally exerting myself more than advisable at this stage of recovery.</p>
<p>The Luxembourg healthcare system continues to impress with its thoroughness - they consider not just whether one can technically get home, but whether doing so in the usual manner might compromise recovery. Capital thinking, I must say.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflections-on-the-week">Reflections on the Week<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#reflections-on-the-week" class="hash-link" aria-label="Direct link to Reflections on the Week" title="Direct link to Reflections on the Week" translate="no">​</a></h2>
<p>This past week at Kirchberg has been characterised by patience and learning. Patience whilst my body adjusts to the anticoagulation therapy, and learning about the lifestyle adjustments that will be part of my life going forward. The mechanical valve offers durability - it should last indefinitely without needing replacement - but it demands this careful management of blood thinning in return.</p>
<p>I've had time to become proficient with the CoaguChek device and come to terms with dietary modifications. The medical team has been thorough in their education, ensuring I understand not just what I need to do, but why I need to do it. Understanding the mechanisms at play makes the restrictions far easier to accept.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="looking-forward">Looking Forward<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#looking-forward" class="hash-link" aria-label="Direct link to Looking Forward" title="Direct link to Looking Forward" translate="no">​</a></h2>
<p>Home beckons most enticingly. Whilst Kirchberg Hospital has provided excellent care, there's no place quite like one's own home for proper recuperation. The familiar surroundings, the comfort of one's own bed, the freedom to potter about at one's own pace - these are the things one misses most during a prolonged hospital stay.</p>
<p>The rehabilitation programme awaits, starting a week or two after my return home. Eight weeks of structured recovery with a consistent group - it will be good to work systematically on rebuilding strength and endurance under professional guidance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-18-summary">Day 18 Summary<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#day-18-summary" class="hash-link" aria-label="Direct link to Day 18 Summary" title="Direct link to Day 18 Summary" translate="no">​</a></h2>
<p>Key developments on Day 18:</p>
<ul>
<li class="">✅ Final week of focused INR monitoring and management</li>
<li class="">✅ Successfully achieving therapeutic INR range with Sintrom</li>
<li class="">✅ Received and trained on Roche CoaguChek for home INR testing</li>
<li class="">✅ Understanding of vitamin K dietary restrictions (farewell, frequent bigos and gołąbki)</li>
<li class="">✅ Echocardiogram confirms new valve functioning properly</li>
<li class="">✅ Pacemaker check and optimisation for 15-year battery life</li>
<li class="">✅ Prescription for ambulance transport home arranged</li>
<li class="">✅ Continued physical limitations (no lifting &gt;5kg, limited walking distance)</li>
<li class="">✅ Preparing mentally and practically for home discharge</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-summary">Progress Summary<a href="https://blog.mark-burton.com/2025/10/20/day-18-home-time#progress-summary" class="hash-link" aria-label="Direct link to Progress Summary" title="Direct link to Progress Summary" translate="no">​</a></h2>
<p>Day 18 represents the culmination of the acute recovery phase. From open-heart surgery to pacemaker implantation, from intensive care to cardiac ward, the journey has been eventful. Now, with blood thinning properly managed, mechanical valve and pacemaker functioning correctly, and a clear understanding of the limitations and requirements going forward, the focus shifts to home recovery and the longer rehabilitation journey ahead.</p>
<p>The next chapter begins at home, where the real work of rebuilding strength and adapting to life with a mechanical valve and pacemaker truly commences. Rather exciting, in its own way - the start of a new normal, as they say.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
            <category>Hospital</category>
            <category>Kirchberg</category>
            <category>INR</category>
            <category>Anticoagulation</category>
        </item>
        <item>
            <title><![CDATA[Days 10-12 of Recovery - Transfer to Kirchberg and Cardiologist Care]]></title>
            <link>https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer</link>
            <guid>https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer</guid>
            <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Days 10-12 post-surgery: quiet Sunday, transfer from INCCI to Kirchberg, and beginning specialised cardiac monitoring.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sunday-12th-october-2025---day-10">Sunday, 12th October 2025 - Day 10<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#sunday-12th-october-2025---day-10" class="hash-link" aria-label="Direct link to Sunday, 12th October 2025 - Day 10" title="Direct link to Sunday, 12th October 2025 - Day 10" translate="no">​</a></h2>
<p>Day 10 was a very quiet day, two days after the pacemaker surgery. The focus was on waiting for news about the next stage of my recovery journey, though the delay in transferring to Kirchberg felt frustrating as it meant another day before ultimately getting home.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="waiting-for-transfer-news">Waiting for Transfer News<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#waiting-for-transfer-news" class="hash-link" aria-label="Direct link to Waiting for Transfer News" title="Direct link to Waiting for Transfer News" translate="no">​</a></h2>
<p>The doctors did their rounds at about 10:30. Unfortunately, they confirmed what I feared - Kirchberg didn't have a bed available today. However, my move to Kirchberg is confirmed for tomorrow, so at least I have the certainty now that I will be transferred. Knowing the plan, even if delayed by a day, provides peace of mind.</p>
<p>The doctor did tell me that if I have visitors today, I am permitted to go to the café with them downstairs, which would be the first time I have been out of the ward, apart from for tests, since I entered the hospital 11 days ago. After so long confined to the ward, the prospect of simply sitting in a café felt like a significant milestone.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-afternoon-of-freedom">An Afternoon of Freedom<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#an-afternoon-of-freedom" class="hash-link" aria-label="Direct link to An Afternoon of Freedom" title="Direct link to An Afternoon of Freedom" translate="no">​</a></h2>
<p>At 15:00 some friends came to visit, and I was allowed out! I had a frothy coffee, a cold sparkling water and very pleasant catch-up. It was wonderful to have a change of scenery and to spend time with friends outside the clinical environment of the ward. These small moments of normalcy are incredibly valuable during a long hospital stay.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-10-summary">Day 10 Summary<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#day-10-summary" class="hash-link" aria-label="Direct link to Day 10 Summary" title="Direct link to Day 10 Summary" translate="no">​</a></h2>
<p>Key developments on Day 10:</p>
<ul>
<li class="">✅ Transfer to Kirchberg confirmed for Monday (Day 11)</li>
<li class="">✅ First permission to leave the ward for social visits</li>
<li class="">✅ Successful café visit with friends - first time out in 11 days</li>
<li class="">✅ Quiet day allowing continued recovery from pacemaker surgery</li>
</ul>
<p>Whilst the delay was frustrating as it meant spending another day in hospital and delaying my eventual return home, the confirmation of tomorrow's transfer at least provided certainty about the next step. The café visit offered a welcome break from the ward environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="monday-13th-october-2025---day-11">Monday, 13th October 2025 - Day 11<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#monday-13th-october-2025---day-11" class="hash-link" aria-label="Direct link to Monday, 13th October 2025 - Day 11" title="Direct link to Monday, 13th October 2025 - Day 11" translate="no">​</a></h2>
<p>As expected today, I moved from INCCI to Kirchberg after I had eaten my breakfast and had clean dressings put on.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-last-walk-and-sudden-departure">The Last Walk and Sudden Departure<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#the-last-walk-and-sudden-departure" class="hash-link" aria-label="Direct link to The Last Walk and Sudden Departure" title="Direct link to The Last Walk and Sudden Departure" translate="no">​</a></h2>
<p>The physio arrived for a last walk, but just as I said I think I have time, the transport arrived so we had to skip the walk. My belongings were stuffed into my bags and I was wheeled out of INCCI and into a luxambulance for my transfer to Kirchberg.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="transfer-to-kirchberg">Transfer to Kirchberg<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#transfer-to-kirchberg" class="hash-link" aria-label="Direct link to Transfer to Kirchberg" title="Direct link to Transfer to Kirchberg" translate="no">​</a></h2>
<p>Traffic wasn't terrible - 20 minutes later I was wheeled into the cardiology ward in Kirchberg hospital, a somewhat calmer vibe than INCCI. My vital stats were checked and tested to the mobile heart monitor. Today is for monitoring and continuation of the care from INCCI. Tomorrow morning I will meet my cardiologist, after which there should be a clearer plan for my stay and hopefully a confirmed day for returning home - please let it be Wednesday.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-11-summary">Day 11 Summary<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#day-11-summary" class="hash-link" aria-label="Direct link to Day 11 Summary" title="Direct link to Day 11 Summary" translate="no">​</a></h2>
<p>Key developments on Day 11:</p>
<ul>
<li class="">✅ Final breakfast and dressing change at INCCI</li>
<li class="">✅ Planned physio walk cancelled due to early transport arrival</li>
<li class="">✅ Successfully transferred to Kirchberg hospital via luxambulance (20 minutes)</li>
<li class="">✅ Settled into cardiology ward with calmer atmosphere</li>
<li class="">✅ Vital signs monitoring and mobile heart monitor setup</li>
<li class="">✅ Awaiting cardiologist consultation on Day 12</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tuesday-14th-october-2025---day-12">Tuesday, 14th October 2025 - Day 12<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#tuesday-14th-october-2025---day-12" class="hash-link" aria-label="Direct link to Tuesday, 14th October 2025 - Day 12" title="Direct link to Tuesday, 14th October 2025 - Day 12" translate="no">​</a></h2>
<p>Day 12 started early - very early. The nurse was in to take blood to get an INR at 4:50, followed by another nurse to do an ECG. I soon dropped off until 7:15, which felt like a better hour to wake up.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inr-results-and-doctors-rounds">INR Results and Doctor's Rounds<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#inr-results-and-doctors-rounds" class="hash-link" aria-label="Direct link to INR Results and Doctor's Rounds" title="Direct link to INR Results and Doctor's Rounds" translate="no">​</a></h2>
<p>My INR was 1.4 - that is slightly higher than a normal person but lower than the 2-3 I am looking for to ensure there are no blood clots as a result of the mechanical aorta.</p>
<p>The doctor did his rounds around 11:00 and the news was not what I wanted to hear. With the INR being low, he said I could be home by the end of the week. If the INR is better tomorrow, it could be Thursday.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-physio-session-at-kirchberg">First Physio Session at Kirchberg<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#first-physio-session-at-kirchberg" class="hash-link" aria-label="Direct link to First Physio Session at Kirchberg" title="Direct link to First Physio Session at Kirchberg" translate="no">​</a></h2>
<p>The physio introduced me to the 8-week rehabilitation course which will start a week or 2 after I return home, depending on a new group starting with a space. I will rehabilitate together with the same people for the 8 weeks.</p>
<p>I did my first physio session which, like at INCCI, involved a walk on the ward and a flight of stairs, but then went on to various standing exercises like heel raises, toe raises and leg raises to the side and behind.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="planning-ahead">Planning Ahead<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#planning-ahead" class="hash-link" aria-label="Direct link to Planning Ahead" title="Direct link to Planning Ahead" translate="no">​</a></h2>
<p>I'll have some time to pass while I wait for my INR to come good, so it seems like a good opportunity to try out <a href="https://github.com/khulnasoft/spec-kit" target="_blank" rel="noopener noreferrer" class="">spec-kit</a> to do spec-driven development of an app to remind me to take my blood medicine in the evening and do a blood test and log my INR in the morning.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-12-summary">Day 12 Summary<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#day-12-summary" class="hash-link" aria-label="Direct link to Day 12 Summary" title="Direct link to Day 12 Summary" translate="no">​</a></h2>
<p>Key developments on Day 12:</p>
<ul>
<li class="">✅ Early morning blood draw (4:50 AM) for INR test</li>
<li class="">✅ INR result: 1.4 (below target range of 2-3)</li>
<li class="">✅ Discharge delayed - potentially end of week, Thursday if INR improves</li>
<li class="">✅ Introduction to 8-week rehabilitation programme</li>
<li class="">✅ First comprehensive physio session with exercises</li>
<li class="">✅ Planning medication tracking app development</li>
</ul>
<p>The lower than expected INR means a few more days at Kirchberg, which is frustrating but necessary to ensure the blood is at the right consistency to prevent clots with the mechanical valve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-summary">Progress Summary<a href="https://blog.mark-burton.com/2025/10/14/days-10-11-quiet-days-and-transfer#progress-summary" class="hash-link" aria-label="Direct link to Progress Summary" title="Direct link to Progress Summary" translate="no">​</a></h2>
<p>Days 10-12 represent a crucial transition phase in my recovery - from the frustrating delay after pacemaker surgery, through the transfer from acute care at INCCI to specialist cardiac monitoring at Kirchberg, where my cardiologist will finalise the plan for discharge and return to normal life.</p>
<p>The café visit on Day 10 was a poignant reminder that recovery isn't just about medical milestones, but also about reconnecting with normal life, one small step at a time. The transfer on Day 11 moved me to the next stage of care.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
            <category>Hospital</category>
            <category>Kirchberg</category>
            <category>INCCI</category>
        </item>
        <item>
            <title><![CDATA[Day 9 of Recovery - Pacemaker Results, You Won't Believe What Comes Next]]></title>
            <link>https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery</link>
            <guid>https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery</guid>
            <pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Day 9 post-surgery: excellent pacemaker results, removal of temporary wires, and news about the next stage of care.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="saturday-11th-october-2025">Saturday, 11th October 2025<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#saturday-11th-october-2025" class="hash-link" aria-label="Direct link to Saturday, 11th October 2025" title="Direct link to Saturday, 11th October 2025" translate="no">​</a></h2>
<p>Day 9 brought some pivotal moments in my recovery journey - pacemaker assessment results and news about the next stage of my care.</p>
<p>I woke up, you guessed it, in pain, but my breakfast was there so the nurse helped me get upright. At this point I was allowed to stand up but until we had the results from the doctors I was still confined to my room.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-morning-wait">The Morning Wait<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#the-morning-wait" class="hash-link" aria-label="Direct link to The Morning Wait" title="Direct link to The Morning Wait" translate="no">​</a></h2>
<p>Every other day during my stay in the hospital the doctors have been there promptly with breakfast, not today. So I had breakfast and waited. The nurse didn't know why they were late, good news? Bad news? No news? Waited a while and the nurse decided I should get ready for the day, you know Murphy's law, if I go into the bathroom and turn the shower on surely that will summon the doctors :)</p>
<p>As it happens, no, it didn't, so I was helped back into bed to get comfortable for the remainder of the wait.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="excellent-news-from-the-doctors">Excellent News from the Doctors<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#excellent-news-from-the-doctors" class="hash-link" aria-label="Direct link to Excellent News from the Doctors" title="Direct link to Excellent News from the Doctors" translate="no">​</a></h2>
<p>Well, whatever the reason for the delay I needn't (use that exact word it is definitely a real word) have worried, around 10:15 the doctors arrived and their demeanour was jovial. The first task at hand was to remove my temporary pacemaker wires, one doctor took care of that while the other left me with the teaser he would return "with great plans for me". Removal of the pacemaker wires was quick and pretty painless.</p>
<p>The other doctor was on the hunt for a machine to read my pacemaker, it took a few minutes, maybe it was in Kirchberg, but he returned with a kind of big old brief case laptop slash leap child computer looking thing, whatever it didn't matter what it looks like, it worked and successfully read the pacemaker and the report was good, it had worked properly all night and everything remained exactly where it should be which was confirmed by an ultrasound.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-plan-moving-to-kirchberg">The Plan: Moving to Kirchberg<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#the-plan-moving-to-kirchberg" class="hash-link" aria-label="Direct link to The Plan: Moving to Kirchberg" title="Direct link to The Plan: Moving to Kirchberg" translate="no">​</a></h2>
<p>Finally, the teased plans, everything is good, I can move on to the next stage of my recovery a couple of nights in Kirchberg hospital so my cardiologist can have a look at the work. I was deemed fit enough to go home tomorrow, but it was always the plan that I would be discharged to Kirchberg for my cardiologist to observe me for a couple of days.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="afternoon-visit-and-entertainment-setup">Afternoon Visit and Entertainment Setup<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#afternoon-visit-and-entertainment-setup" class="hash-link" aria-label="Direct link to Afternoon Visit and Entertainment Setup" title="Direct link to Afternoon Visit and Entertainment Setup" translate="no">​</a></h2>
<p>After that exciting morning my wife came to visit after circumnavigating Luxembourg.</p>
<p>A nurse dropped off an information sheet about the limitations imposed by a pacemaker, not many of concern, this was written in French so my interpretation is mine and I'm sticking to it:</p>
<ul>
<li class="">No more airports, the security scanners are no good for a pacemaker</li>
<li class="">No more going into shops with security scanners at the door, same reason as above basically</li>
<li class="">Keep a safe 30-40cm from induction hobs, eerrrr not great then, this I was not aware of before the operation, this might have changed my whole decision making process, but hey I have arms which are longer than 40cm so hopefully this will be fine</li>
<li class="">No martial arts, I'll have to finally give up on ever getting that Tae Kwon Do black belt.</li>
<li class="">No chopping wood, as enjoyable camping in Krynica Morska was (well we were in a hotel near the camp site) with my cousin in full Bear Grylls mode was next time sadly my wood chopping assistance won't be available</li>
</ul>
<p>Since the days are a little slower now I improved my entertainment setup, whilst CNBC Europe had provided some terrible repetitive English language TV for the last week and the Trounwiessel (the accession to the throne - the transition of the Crown from Grand Duke Henri to his son Guillaume) had passed the time last weekend and RTL showed Luxembourg's brave battling 4-0 defeat to Germany last night. My tablet arrived, part of my wife's epic journey, I'm all set, work crap removed and VPN installed along with iPlayer so I can join in the family strictly watching.</p>
<p>The day ended with the cannula put in for the IV drip yesterday being taken out. For the first time since the operation I am not punctured :) not sure that will last long though.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-summary">Progress Summary<a href="https://blog.mark-burton.com/2025/10/12/day-9-pacemaker-recovery#progress-summary" class="hash-link" aria-label="Direct link to Progress Summary" title="Direct link to Progress Summary" translate="no">​</a></h2>
<p>Key developments on Day 9:</p>
<ul>
<li class="">✅ Temporary pacemaker wires successfully removed</li>
<li class="">✅ Pacemaker reading showed perfect function overnight</li>
<li class="">✅ Ultrasound confirmed everything in correct position</li>
<li class="">✅ Approved for transfer to Kirchberg hospital</li>
<li class="">✅ Cardiologist observation scheduled for next few days</li>
<li class="">✅ Received pacemaker limitation information</li>
<li class="">✅ Improved entertainment options with tablet and VPN</li>
<li class="">✅ Cannula removed - first time not punctured since operation</li>
</ul>
<p>The pacemaker is working brilliantly and I'm progressing well enough to move to the next phase of recovery under my cardiologist's care at Kirchberg. The medical team's positive demeanour this morning was a clear indicator that things are going according to plan.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
            <category>Pacemaker</category>
        </item>
        <item>
            <title><![CDATA[Day 8 of Recovery - Additional Surgery to Fit Pacemaker]]></title>
            <link>https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery</link>
            <guid>https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery</guid>
            <pubDate>Sat, 11 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Day 8 post-surgery: heart rhythm concerns lead to permanent pacemaker implantation procedure.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-8-friday-10th-october-2025">Day 8: Friday, 10th October 2025<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#day-8-friday-10th-october-2025" class="hash-link" aria-label="Direct link to Day 8: Friday, 10th October 2025" title="Direct link to Day 8: Friday, 10th October 2025" translate="no">​</a></h2>
<p>My recovery took an unexpected turn today as persistent heart rhythm issues necessitated additional intervention - the implantation of a permanent pacemaker to replace the temporary external device I've been carrying since the valve replacement surgery.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="early-morning-blood-test">Early Morning Blood Test<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#early-morning-blood-test" class="hash-link" aria-label="Direct link to Early Morning Blood Test" title="Direct link to Early Morning Blood Test" translate="no">​</a></h2>
<p>The day started at 5:30 AM when the night shift nurses arrived for a blood test. They had kindly advised me the previous evening that this would be happening, which made the early wake-up call less jarring. It's these small considerations that make hospital life more bearable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="morning-consultation-with-the-doctors">Morning Consultation with the Doctors<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#morning-consultation-with-the-doctors" class="hash-link" aria-label="Direct link to Morning Consultation with the Doctors" title="Direct link to Morning Consultation with the Doctors" translate="no">​</a></h2>
<p>During the morning catch-up with the medical team, they explained that whilst my heart's behaviour isn't dangerous, it continues to exhibit patterns that can't be allowed to persist after discharge. The team mentioned that the rhythmologue - we don't seem to use that word in English, preferring the more straightforward "heart rhythm specialist" - would be speaking with me today. This specialist focuses specifically on cardiac rhythm disorders and would have the final say on treatment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rhythmologists-decision">The Rhythmologist's Decision<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#the-rhythmologists-decision" class="hash-link" aria-label="Direct link to The Rhythmologist's Decision" title="Direct link to The Rhythmologist's Decision" translate="no">​</a></h2>
<p>Shortly after breakfast, the surgical assistant dropped by with a message from the rhythmologist. The misbehaviour of my heart rhythm was significant enough to make a permanent pacemaker the best next step. For me, this represents quite an improvement over the portable external Osypka Pace 203H I've been carrying around for the past week, with its electrode cables threaded through my chest wall.</p>
<p>A permanent pacemaker will be completely internal, eliminating the need to carry external equipment and providing more reliable, long-term rhythm management.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-pacemaker-implantation">Understanding Pacemaker Implantation<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#understanding-pacemaker-implantation" class="hash-link" aria-label="Direct link to Understanding Pacemaker Implantation" title="Direct link to Understanding Pacemaker Implantation" translate="no">​</a></h2>
<p>Compared to the major open-heart surgery I underwent eight days ago, pacemaker implantation is a relatively straightforward procedure. The operation typically takes 1-2 hours and is performed under local anaesthetic with sedation.</p>
<p>The procedure involves:</p>
<ol>
<li class=""><strong>Incision</strong>: A small cut (typically 5-8 cm) is made just below the collarbone, usually on the left side</li>
<li class=""><strong>Lead insertion</strong>: Two thin, insulated wires (leads) are threaded through a vein and guided into position in the heart chambers using X-ray imaging</li>
<li class=""><strong>Lead attachment</strong>: The leads are attached to the heart muscle where they can sense the heart's electrical activity and deliver electrical impulses when needed</li>
<li class=""><strong>Pacemaker placement</strong>: The pacemaker device itself - about the size of a large wristwatch - is inserted into a small pocket created under the skin beneath the collarbone</li>
<li class=""><strong>Connection</strong>: The leads are connected to the pacemaker generator</li>
<li class=""><strong>Testing</strong>: The system is tested to ensure proper functioning</li>
<li class=""><strong>Closure</strong>: The incision is closed with dissolvable stitches</li>
</ol>
<p>In my case, due to being relatively young for a pacemaker recipient, the doctor opted for a cutting-edge approach: His bundle pacing (HBP) or left bundle branch area pacing (LBBAP). This technique provides more natural stimulation of the heart with less energy consumption, which translates to longer battery life for the pacemaker - an important consideration given my age.</p>
<p>The pacemaker will monitor my heart rhythm continuously and provide electrical impulses to maintain a steady heartbeat whenever needed. Modern pacemakers are incredibly sophisticated, automatically adjusting to my activity levels and only intervening when necessary.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-operation-preparation">Pre-Operation Preparation<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#pre-operation-preparation" class="hash-link" aria-label="Direct link to Pre-Operation Preparation" title="Direct link to Pre-Operation Preparation" translate="no">​</a></h2>
<p>At 12:00, the pre-operative preparations began:</p>
<ul>
<li class=""><strong>Chest shave</strong>: Clearing the surgical site for optimal sterility and electrode placement</li>
<li class=""><strong>Isobetadine wash</strong>: The familiar dark red antiseptic wash I'd experienced before my valve surgery</li>
<li class=""><strong>Mouthwash</strong>: Part of the standard infection prevention protocol</li>
</ul>
<p>At 15:00, I was taken through to the surgical wing of the hospital for final preparation. I received my top-quality hospital bed socks - essential for keeping warm in the chilly operating theatre. An IV line was inserted, and with a hair net on, I was ready to go.</p>
<p>The operation was scheduled for 16:00 (4:00 PM).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-procedure-update">Post-Procedure Update<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#post-procedure-update" class="hash-link" aria-label="Direct link to Post-Procedure Update" title="Direct link to Post-Procedure Update" translate="no">​</a></h2>
<p>The surgery started on time at 16:00, and the attempt to use the branch bundle approach was a success. By 17:15, I was back in my hospital room with my wife, sporting a brand new freshly stitched and glued wound. I'm now confined to bed until morning - somewhat more comfortable as I can't wear the post-thorax protective gilet.</p>
<p>My shoulder started to wake up at about 19:30 - an interesting feeling. Not pain yet, but frozen, heavy, and I can't move it. Having explained this to the nurses, pain medicine was prescribed, as it will be pain before morning. I was able to get some sleep quite quickly.</p>
<p>I was woken by the night shift nurses doing their check around 21:30, and there was pain - quite a lot of pain. They quickly fixed that with some analgesics, and thankfully I was able to sleep again. At 3:30, either noises in the corridor or the pain woke me - pretty bad again. I buzzed for the nurse and got more pain relief, and again, thankfully, quickly back to sleep, this time all the way until breakfast time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflections">Reflections<a href="https://blog.mark-burton.com/2025/10/11/day-8-pacemaker-surgery#reflections" class="hash-link" aria-label="Direct link to Reflections" title="Direct link to Reflections" translate="no">​</a></h2>
<p>Whilst an additional surgical procedure wasn't in the original recovery plan, it's reassuring to know the medical team is taking a proactive approach to ensure the best long-term outcome. The temporary pacemaker has been functional but cumbersome - having an internal, permanent solution will be a significant quality of life improvement.</p>
<p>The fact that this is considered a relatively minor procedure compared to the valve replacement helps put it in perspective. Eight days ago, I underwent open-heart surgery with a heart-lung bypass machine. Today's procedure, whilst important, is far less invasive and carries significantly lower risks.</p>
<p>I was awake throughout the pacemaker procedure. The worst pain was from the local anaesthetic injections. The surgeon warned me I might feel the cutting - I could, and I didn't like it. They gave me some more local anaesthetic, and after that, the only things I felt were the beating of my heart racing as they tested things and being pulled around as they stitched and glued me back together. I don't think I even got sedated - just an antibiotic drip.</p>
<p>I'm grateful for the thorough monitoring that identified this need before discharge, and for the expertise of the cardiac rhythm team in making this decision.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
            <category>Pacemaker</category>
        </item>
        <item>
            <title><![CDATA[Days 6-7 of Recovery - Settling Into the Normal Ward]]></title>
            <link>https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress</link>
            <guid>https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress</guid>
            <pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Days 6-7 post-surgery: settling into the normal ward routine, managing tachycardia, and continuing physiotherapy whilst the medical team determines the optimal medication approach.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="days-6-7-wednesday-thursday-8th-9th-october-2025">Days 6-7: Wednesday-Thursday, 8th-9th October 2025<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#days-6-7-wednesday-thursday-8th-9th-october-2025" class="hash-link" aria-label="Direct link to Days 6-7: Wednesday-Thursday, 8th-9th October 2025" title="Direct link to Days 6-7: Wednesday-Thursday, 8th-9th October 2025" translate="no">​</a></h2>
<p>Days 2 and 3 on the normal ward were remarkably similar, establishing a new routine whilst the medical team continued to fine-tune my treatment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="daily-routine">Daily Routine<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#daily-routine" class="hash-link" aria-label="Direct link to Daily Routine" title="Direct link to Daily Routine" translate="no">​</a></h2>
<p>The normal ward routine is more relaxed than intensive or intermediate care. Nothing happens until 7:30 when breakfast arrives along with the standard observations - blood pressure, heart rate, temperature, and oxygen saturation. The doctor's team then comes round with updates. On Day 5, I woke earlier with a headache and buzzed for paracetamol before going back to sleep until breakfast time.</p>
<p>The food has been pretty good since moving off the terrible no-residual diet - there's even a menu with a couple of choices and a vegetarian option, though breakfast remained uninspiring.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="physiotherapy-progress">Physiotherapy Progress<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#physiotherapy-progress" class="hash-link" aria-label="Direct link to Physiotherapy Progress" title="Direct link to Physiotherapy Progress" translate="no">​</a></h2>
<p>Day 5 brought a significant milestone. After getting ready, I headed for a short stroll and ran into the physio. Before we could start, I was called for an X-ray. The physio took over as my chaperone, and we walked to the X-ray department at quite a clip whilst I explained my elevated heart rate situation.</p>
<p>The X-ray was super quick, and the physio guided me back via a flight of stairs. Made it all the way up today! Back in my room, I discovered I'd even scored one Google Fit heart point - my first one post-surgery! Throughout the day, I achieved 3279 steps and climbed 2 flights of stairs in total.</p>
<p>Later that afternoon, after breathing exercises and lunch, the physio returned for another stairs session. Three of us from the ward congregated at the top for a rest. I won first place for highest heart rate, but my only prize was more loud heart noises in my head.</p>
<p>Day 6 followed a similar pattern - the main difference being no X-ray scheduled. The routine of physiotherapy sessions, walking exercises throughout the ward, and regular breathing exercises with the respiratory exerciser continued. I managed approximately 3600 steps and 1 flight of stairs. On my last walk of the corridor, my heart rate hit 150+, which was concerning enough that I was prescribed half a pill of medication to help slow it down a bit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ongoing-tachycardia-management">Ongoing Tachycardia Management<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#ongoing-tachycardia-management" class="hash-link" aria-label="Direct link to Ongoing Tachycardia Management" title="Direct link to Ongoing Tachycardia Management" translate="no">​</a></h2>
<p>The surgeon reassured me on Day 5 that I was experiencing common phenomena amongst younger aortic valve replacement patients. While the exact mechanics might not be clearly understood, the heart just got a significant upgrade and occasionally it will skip a beat. In his experience, this is a fairly simple fix: keep drinking plenty of water and doing plenty of walking. I am back on the mobile pacemaker just to be sure.</p>
<p>By Day 6, the team were still deciding on the correct medication to address my tachycardia. The situation is complicated by a one-off momentary pause that was caught on my continual monitoring. Whilst apparently not super uncommon in post-operative valve replacement patients, it does deserve additional monitoring. This is causing the decision-making process to take a bit longer than initially expected.</p>
<p>The combination of elevated heart rate along with the single brief pause means the medical team need to balance the medication carefully - they want to control the rapid heart rate without potentially causing more pauses. The mobile pacemaker continues to provide reassurance and detailed monitoring data to help guide treatment decisions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="anticoagulation-education">Anticoagulation Education<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#anticoagulation-education" class="hash-link" aria-label="Direct link to Anticoagulation Education" title="Direct link to Anticoagulation Education" translate="no">​</a></h2>
<p>On Day 5, I had an important discussion with the nurse about Sintrom (acenocoumarol), the anticoagulation medication I'll be taking long-term. This education session was crucial for understanding my post-discharge care.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-sintrom-is-essential">Why Sintrom is Essential<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#why-sintrom-is-essential" class="hash-link" aria-label="Direct link to Why Sintrom is Essential" title="Direct link to Why Sintrom is Essential" translate="no">​</a></h3>
<p>With a mechanical aortic valve, anticoagulation is vital to prevent blood clots from forming on the valve. The mechanical valve surfaces, whilst durable, can promote clot formation if the blood isn't properly thinned. Sintrom works by interfering with vitamin K-dependent clotting factors, reducing the blood's ability to clot.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="inr-monitoring">INR Monitoring<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#inr-monitoring" class="hash-link" aria-label="Direct link to INR Monitoring" title="Direct link to INR Monitoring" translate="no">​</a></h3>
<p>The International Normalised Ratio (INR) is the key metric for monitoring anticoagulation levels. I'll be able to monitor my INR at home using a portable testing device, similar to how diabetics monitor blood glucose. The target INR range for mechanical valve patients is typically 2.5-3.5, balancing clot prevention against bleeding risk.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="consistency-is-critical">Consistency is Critical<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#consistency-is-critical" class="hash-link" aria-label="Direct link to Consistency is Critical" title="Direct link to Consistency is Critical" translate="no">​</a></h3>
<p>The nurse emphasised two crucial timing considerations:</p>
<ul>
<li class=""><strong>Medication timing</strong>: Take Sintrom in the evening, at the same time each day</li>
<li class=""><strong>Testing timing</strong>: Perform INR tests in the morning, consistently</li>
</ul>
<p>This consistency ensures accurate monitoring and stable anticoagulation levels. Irregular timing can lead to fluctuating INR values that don't truly reflect the medication's effects.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dietary-considerations">Dietary Considerations<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#dietary-considerations" class="hash-link" aria-label="Direct link to Dietary Considerations" title="Direct link to Dietary Considerations" translate="no">​</a></h3>
<p>Sintrom works by antagonising vitamin K, which means dietary vitamin K intake needs to be consistent. The key isn't to avoid vitamin K entirely, but to maintain steady consumption levels. Foods particularly high in vitamin K include:</p>
<ul>
<li class=""><strong>Leafy greens</strong>: Cabbage, spinach, kale, lettuce, Brussels sprouts</li>
<li class=""><strong>Cruciferous vegetables</strong>: Broccoli, cauliflower</li>
<li class=""><strong>Herbs</strong>: Parsley, coriander, basil</li>
<li class=""><strong>Other vegetables</strong>: Asparagus, spring onions</li>
<li class=""><strong>Some oils</strong>: Soybean oil, canola oil</li>
</ul>
<p>The nurse stressed that I don't need to eliminate these healthy foods - just maintain consistency. If I eat spinach regularly, I should continue to do so. The problem arises when someone dramatically changes their vitamin K intake, which can either reduce the medication's effectiveness (if intake increases) or increase bleeding risk (if intake decreases).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-summary">Progress Summary<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#progress-summary" class="hash-link" aria-label="Direct link to Progress Summary" title="Direct link to Progress Summary" translate="no">​</a></h2>
<p>Key developments over these two days:</p>
<ul>
<li class="">✅ Established routine on normal ward</li>
<li class="">✅ Managing post-operative headaches</li>
<li class="">✅ Consistent physiotherapy and mobility work</li>
<li class="">✅ Achieved first post-surgery fitness milestone (stair climbing and Google Fit heart point)</li>
<li class="">✅ Improved dietary options</li>
<li class="">✅ Comprehensive anticoagulation education session with nurse</li>
<li class="">⏳ Medical team carefully evaluating medication options for tachycardia</li>
<li class="">⏳ Additional monitoring due to single momentary pause event</li>
<li class="">⏳ Continued mobile pacemaker monitoring</li>
</ul>
<p>The elevated heart rate episodes are concerning but apparently normal for younger patients after valve replacement. Whilst the medication decision is taking longer than expected, this careful approach demonstrates the thoroughness of the cardiac team in managing the nuances of post-operative recovery, particularly in younger valve replacement patients where heart rhythm variations can occur.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflections-on-progress">Reflections on Progress<a href="https://blog.mark-burton.com/2025/10/08/day-5-normal-ward-progress#reflections-on-progress" class="hash-link" aria-label="Direct link to Reflections on Progress" title="Direct link to Reflections on Progress" translate="no">​</a></h2>
<p>Over these two days, there's been steady progress in mobility and establishing a ward routine, even though the heart rhythm management is proving more complex than anticipated. The ability to climb a full flight of stairs and earn that first fitness point felt like a real achievement, even if it came with some uncomfortable sensations.</p>
<p>The physiotherapy team's consistent attention and the medical team's thorough approach to medication selection help maintain confidence that these temporary challenges are part of the normal healing process for someone my age going through this procedure.</p>
<p>The next updates may come after a few days, once there are significant developments - particularly regarding the move to Kirchberg and any new treatment decisions.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
        </item>
        <item>
            <title><![CDATA[Day 5 - Progress on the Normal Ward]]></title>
            <link>https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress</link>
            <guid>https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress</guid>
            <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[First full day on the normal ward with walking exercises, echo results, and adjusting to new routines.]]></description>
            <content:encoded><![CDATA[<p>Tuesday, 8th October 2025 - My first full day on the normal ward brought different routines and expectations. The focus shifted to increased mobility and continued monitoring of my heart's adaptation to its new hardware.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-missing-eeg">The Missing EEG<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#the-missing-eeg" class="hash-link" aria-label="Direct link to The Missing EEG" title="Direct link to The Missing EEG" translate="no">​</a></h2>
<p>On the normal ward, the day was quite different. At least on this first full day, I was waiting for my 5:30 EEG but nothing happened. Which was kind of annoying because I had not slept well and was ready to be helped out of bed. As it happened, I fell asleep for probably my best hour of sleep of the night. No idea what the lack of sleep was all about really.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="morning-visits">Morning Visits<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#morning-visits" class="hash-link" aria-label="Direct link to Morning Visits" title="Direct link to Morning Visits" translate="no">​</a></h2>
<p>Quiet morning until the surgeon arrived at about the same time as my breakfast and a nurse to do my blood pressure and heart rate. My surgeon got priority. He explained they are still monitoring my heart, which is expectedly tachycardic after the surgery, to get the beta blocker dose right to allow the heart to reconfigure itself to its new hardware. He made it clear I should walk a lot more today.</p>
<p>Before breakfast, the blood pressure was taken and the mobile pacemaker disconnected. The cables remain hanging out of me - they should be removed in the next couple of days.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="physiotherapy-session">Physiotherapy Session<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#physiotherapy-session" class="hash-link" aria-label="Direct link to Physiotherapy Session" title="Direct link to Physiotherapy Session" translate="no">​</a></h2>
<p>After breakfast I went for a short walk and nearly missed my physio. I was taken to the stairs where I walked half a flight of stairs basically unaided. I felt OK, but my heart rate had jumped to 125 from my current resting 95/100 (ish), so we left it there for today and descended the stairs and headed back to the room for breathing exercises.</p>
<p>Throughout the day, I managed to achieve 3824 steps - a significant increase in mobility as I continued to walk the corridors and work on my recovery.</p>
<p>The breathing exercises included one new one: breathe in fully and hold it for 3 seconds. Like most of the breathing exercises, it was extremely hard at first, but throughout the day it is getting less painful to do.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="echocardiogram-results">Echocardiogram Results<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#echocardiogram-results" class="hash-link" aria-label="Direct link to Echocardiogram Results" title="Direct link to Echocardiogram Results" translate="no">​</a></h2>
<p>Before I could even finish my shower, I had a knock on the door. It was time for an echo to have a look at how the new heart hardware was bedding in. Another positive outcome - the heart looks good and the valve looks good. It is a very different squelch sound now on the echocardiogram with the artificial valve.</p>
<p>Not sure if it was something seen on the echo, but the doctor told me I should drink more. I thought it was a bit early in my recovery and the day for a drink. A moment later she clarified "water only".</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="evening-challenges">Evening Challenges<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#evening-challenges" class="hash-link" aria-label="Direct link to Evening Challenges" title="Direct link to Evening Challenges" translate="no">​</a></h2>
<p>My wife came to visit with some supplies, which was lovely. I sat down to my dinner feeling a slightly elevated heart rate everywhere - this is something which will take time for my body to adjust to. My heart is beating more efficiently than it has for years, which makes it feel different in my head and chest, especially as it gets up to the 120 bpm level.</p>
<p>Near the end of dinner, I felt a little strange for a moment. I heard the notifications go off in the nurses' station, looked down at my "continual monitor necklace" (the <a href="https://www.philips.co.uk/healthcare/product/HC865350/mx40-wearable-patient-monitor" target="_blank" rel="noopener noreferrer" class="">Philips MX40-2C4</a>) and saw my heart rate at 120 with a notification. The feeling passed very quickly and the nurse dismissed the notification, so nothing to worry about.</p>
<p>There was no way I would be able to sleep like that though, with such a high heart rate creating the clattering and banging in my head and the feeling of my heart squirming around in my chest. I explained it all to the nurses, who again reassured me that this is common in younger aortic valve replacement patients. Research indicates that <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6016582/" target="_blank" rel="noopener noreferrer" class="">tachycardia is expected post-operatively</a> as the heart adapts to improved haemodynamics, particularly in patients who had significant stenosis pre-operatively.</p>
<p>In my nightly medicine I received something extra which brought my heart rate down, and I slept well aside from the toilet visits. The anaesthetic and water retention play havoc with routine for several days, however I'm just about able to get out of bed myself without too much pain, which is good progress.</p>
<p>Waking up in pain during the night was sometimes confusing - it wasn't always clear whether the support jacket was sitting badly and pushing a sensor or wire into my skin, if muscles were doing something unusual, or if movement had annoyed the sternum.</p>
<p>It's only really today that I figured out for sure that the support jacket can cause discomfort, and just opening it for 5 minutes brings relief. I must be careful though - I wouldn't want to be moving, and more importantly coughing, while it's open, as that could risk the sternum.</p>
<p>Regarding the muscles, sometimes it feels like I don't have the muscle strength in my neck and upper chest to raise my head. This is no big surprise - they will have been impacted by the operation, with surgeons having to work around and through chest muscles to access the heart.</p>
<p>The sternum pain is the easiest to understand, particularly if I cough a little in the night, as this produces the sharpest and shortest pain. While it remains intensely painful, it feels less than it was already - maybe partly because I know how to protect it better when coughing, maybe because as the swelling is reducing and healing is starting, or both.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-notes">Progress Notes<a href="https://blog.mark-burton.com/2025/10/07/day-6-normal-ward-progress#progress-notes" class="hash-link" aria-label="Direct link to Progress Notes" title="Direct link to Progress Notes" translate="no">​</a></h2>
<p>The transition to the normal ward marks a significant step in the recovery process. The focus on increased mobility and the positive echocardiogram results are encouraging signs that the heart is adapting well to the new valve.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This post and future recovery updates are being written with AI assistance (GitHub Copilot) to help me document the experience clearly and efficiently. Working with Copilot on my phone makes it difficult to make corrections myself, so some details may need refinement.</p></div></div>]]></content:encoded>
            <category>Health</category>
            <category>Surgery</category>
            <category>Heart</category>
            <category>Medical</category>
            <category>recovery</category>
        </item>
        <item>
            <title><![CDATA[Day 4 of Recovery - Moving to the Normal Ward]]></title>
            <link>https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward</link>
            <guid>https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward</guid>
            <pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Day 4 post-surgery: transitioning from intermediate care to the normal ward and continuing recovery.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="morning-routine-in-intermediate-care">Morning Routine in Intermediate Care<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#morning-routine-in-intermediate-care" class="hash-link" aria-label="Direct link to Morning Routine in Intermediate Care" title="Direct link to Morning Routine in Intermediate Care" translate="no">​</a></h2>
<p>The pattern had become familiar by now - the night shift nurses arrived at 5:30 AM and had to wake me for the daily ECG. After another snooze, a whole new team of nurses arrived for the day shift. Unlike previous days, there was no X-ray scheduled today.</p>
<p>I was gotten ready for the surgeon's visit, who arrived with a big team of doctors and students in tow. He asked me if I needed the oxygen anymore. I gave an honest shrug - "I don't know." He told me he would check and, after confirming my oxygen levels were good, ordered the oxygen removed. Then came the good news: they were preparing a new room for me in the standard care ward.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-move-across-the-hall">The Move Across the Hall<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#the-move-across-the-hall" class="hash-link" aria-label="Direct link to The Move Across the Hall" title="Direct link to The Move Across the Hall" translate="no">​</a></h2>
<p>No sooner had I finished my breakfast than a team of nurses arrived to move me to my new room. The journey wasn't far - all the way directly across the hall!</p>
<p>The transition brought several welcome changes:</p>
<ul>
<li class=""><strong>Oxygen line removed</strong>: No longer needed, confirming my lungs were recovering well</li>
<li class=""><strong>Heart monitor upgrade</strong>: The continual monitoring equipment shrank to a portable Phillips MX40-2C4 that I can carry around my neck. It still sends all the data to the central nurse station, but I'm no longer tethered to a bedside machine</li>
<li class=""><strong>Mobile pacemaker</strong>: I still have to carry this around as well, though they mentioned it would be removed in the next day or two</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-temporary-pacemaker">The Temporary Pacemaker<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#the-temporary-pacemaker" class="hash-link" aria-label="Direct link to The Temporary Pacemaker" title="Direct link to The Temporary Pacemaker" translate="no">​</a></h2>
<p>The mobile pacemaker I'm carrying around is an Osypka Pace 203H - a German-made temporary external pacemaker commonly used after cardiac surgery. The device has electrode cables that were threaded through my chest wall into my heart during the operation, allowing the medical team to control my heart rate externally if needed.</p>
<p>The Osypka unit monitors and can pace my heart to maintain a steady rhythm during the critical early recovery phase. To my knowledge, it hasn't needed to actively pace yet, which is a good sign that my heart is maintaining its own rhythm well. The cables will be removed in the next day or two once the surgical team is confident everything is stable.</p>
<p>I have to admit, when I first saw the name "Osypka" on the device, my mind immediately went to oscypek - that delicious Polish smoked sheep's cheese from the Tatra Mountains. At least if I'm going to be tethered to a medical device, it can remind me of one of my favourite cheeses! Though I suspect the German engineer Dr. Peter Osypka who founded the company wasn't thinking about Polish mountain cheese when he named it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="life-in-the-normal-ward">Life in the Normal Ward<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#life-in-the-normal-ward" class="hash-link" aria-label="Direct link to Life in the Normal Ward" title="Direct link to Life in the Normal Ward" translate="no">​</a></h2>
<p>Now I'm in a nice quiet room alone. No more beeping machines, though there are still plenty of nurse visits, tests, and medicine to take. The quieter environment is a welcome change after the hectic intermediate care ward.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="physiotherapy-and-breathing-exercises">Physiotherapy and Breathing Exercises<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#physiotherapy-and-breathing-exercises" class="hash-link" aria-label="Direct link to Physiotherapy and Breathing Exercises" title="Direct link to Physiotherapy and Breathing Exercises" translate="no">​</a></h2>
<p>The physio took me for a walk down the corridor, which went well. My mobility is improving daily.</p>
<p>She also gave me some more advanced breathing exercises to do, and I'm now using my Mediflo Duo respiratory exerciser at level 3 of 5. These exercises are crucial because of the discomfort and reduced activity - the temptation is to breathe superficially, which is bad for recovery. Shallow breathing allows bad stuff to build up, leading to coughing (which rates 10 out of 10 on the pain scale, even in the special braced position) and worse possibilities like infection if I don't do the breathing exercises properly and keep my airways clear.</p>
<p>The Mediflo Duo is an incentive spirometer with adjustable resistance levels that helps improve lung capacity after surgery. Starting at level 3 indicates good progress - it provides enough resistance to challenge the lungs without being overwhelming during this early recovery phase.</p>
<p>The "special braced position" I mention is essential for managing pain during coughing, standing up, or sitting down. They provided me with a recovery gilet (a padded vest), and the technique is to fold your arms across your body with your hands tucked into your armpits, essentially hugging yourself tightly. This braces and supports the chest incision area, reducing the stress on the sternum and making movements much more bearable. Without this bracing technique, even simple movements would be excruciating.</p>
<p>Despite the pain, I'm committed to doing the breathing exercises regularly. They're an essential part of preventing complications.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="progress-summary">Progress Summary<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#progress-summary" class="hash-link" aria-label="Direct link to Progress Summary" title="Direct link to Progress Summary" translate="no">​</a></h2>
<p>Day 5 marks a significant milestone in my recovery:</p>
<ul>
<li class="">✅ Moved to normal ward</li>
<li class="">✅ Oxygen support no longer needed</li>
<li class="">✅ Portable monitoring equipment</li>
<li class="">✅ Increased mobility with corridor walks</li>
<li class="">✅ Advanced breathing exercises</li>
<li class="">⏳ Temporary pacemaker still in place (removal soon)</li>
</ul>
<p>The steady progression from intensive care to intermediate care and now to the normal ward shows good recovery. Each day brings more independence and fewer machines, though the vigilant medical monitoring continues to ensure everything heals properly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-to-move-safely">Learning to Move Safely<a href="https://blog.mark-burton.com/2025/10/07/day-4-move-to-normal-ward#learning-to-move-safely" class="hash-link" aria-label="Direct link to Learning to Move Safely" title="Direct link to Learning to Move Safely" translate="no">​</a></h2>
<p>I should mention that I did manage to get myself into and out of bed on a couple of occasions today, but I don't recommend rushing this milestone. The movement requires not just getting upright, but also spinning around - a complex manoeuvre that puts considerable strain on the healing sternum.</p>
<p>I've decided to work with the nurses for a few more days to master the progression: first, sitting upright confidently; then, standing up by myself; and finally, the full bed transfer. Getting in and out of the chair using the brace is manageable now - the pain is fine. But the bed is still a bit much with that additional twisting motion required.</p>
<p>I also realised I'd been forgetting an important step: adjusting the bed controls to put it in the optimal position before attempting to get out. The right bed angle can make a significant difference in reducing pain and strain during the movement. It's these small techniques that the nursing staff know from experience, and it's worth taking the time to learn them properly rather than powering through with extra pain.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
        </item>
        <item>
            <title><![CDATA[Days 2-3 Post-Surgery - Standing and Walking]]></title>
            <link>https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery</link>
            <guid>https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery</guid>
            <pubDate>Sat, 04 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Early morning tests, drainage tube removal, cannula removal, and my first walk.]]></description>
            <content:encoded><![CDATA[<p>Saturday and Sunday, 5th-6th October 2025 - Days 2 and 3 after my aortic valve replacement surgery were remarkably similar, with continued progress in my recovery. From early morning monitoring through to standing up and eventually taking my first walk.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-2---saturday-morning">Day 2 - Saturday Morning<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#day-2---saturday-morning" class="hash-link" aria-label="Direct link to Day 2 - Saturday Morning" title="Direct link to Day 2 - Saturday Morning" translate="no">​</a></h2>
<p>The day started early at 5:30 AM with an ECG whilst still in bed. This was followed by an X-ray around 7:00 AM, also conducted bedside. These morning tests are a routine part of post-operative monitoring to check heart function and lung condition after cardiac surgery.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drainage-tube-removal">Drainage Tube Removal<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#drainage-tube-removal" class="hash-link" aria-label="Direct link to Drainage Tube Removal" title="Direct link to Drainage Tube Removal" translate="no">​</a></h2>
<p>The surgeon came to visit and confirmed that my drainage tube would be removed. The drainage tube had been collecting excess fluid from around the surgical site, and its removal is a significant milestone in the recovery process.</p>
<p>The removal itself felt rather gross as it was pulled out - there's simply no way to make extracting a tube from your chest comfortable. However, almost instantly I could breathe easier with much less pain. The difference was remarkable and immediate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breathing-exercises">Breathing Exercises<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#breathing-exercises" class="hash-link" aria-label="Direct link to Breathing Exercises" title="Direct link to Breathing Exercises" translate="no">​</a></h2>
<p>I worked with my breathing machine (incentive spirometer) both before and after the drainage tube was removed. The difference was huge. With the tube in place, each breath had been limited by discomfort and the physical presence of the tube. Once removed, my lung capacity improved dramatically.</p>
<p>A little later, the physiotherapist came for our session. It was amazing how much better my breathing was compared to yesterday's sessions. The improvement in lung function after drainage tube removal was substantial and encouraging.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-time-standing">First Time Standing<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#first-time-standing" class="hash-link" aria-label="Direct link to First Time Standing" title="Direct link to First Time Standing" translate="no">​</a></h2>
<p>Lunch came around at 12:30. Whilst the nurse helped me swing my legs off the bed, I stood up under my own power for the first time since surgery. This is a crucial milestone in cardiac recovery - getting vertical helps with circulation, breathing, and reducing the risk of complications from prolonged bed rest.</p>
<p>The nursing staff were supportive throughout, ensuring I moved safely whilst encouraging independence where possible.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="saturday-night---water-retention-management">Saturday Night - Water Retention Management<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#saturday-night---water-retention-management" class="hash-link" aria-label="Direct link to Saturday Night - Water Retention Management" title="Direct link to Saturday Night - Water Retention Management" translate="no">​</a></h2>
<p>On Saturday night (whilst I still had the neck cannula in place), the doctor decided to start me on an infusion of <a href="https://en.wikipedia.org/wiki/Furosemide" target="_blank" rel="noopener noreferrer" class="">Lasix</a> (furosemide), a diuretic medication, to address my water retention. That meant not much sleep that night as I kept filling the pee bottle and buzzing the nurses for new ones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-3---sunday-morning---freedom-from-lines">Day 3 - Sunday Morning - Freedom from Lines<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#day-3---sunday-morning---freedom-from-lines" class="hash-link" aria-label="Direct link to Day 3 - Sunday Morning - Freedom from Lines" title="Direct link to Day 3 - Sunday Morning - Freedom from Lines" translate="no">​</a></h2>
<p>On Sunday, the biggest milestone was the removal of the remaining cannula from my neck. Based on how it felt coming out, I assume it was something quite sizeable - likely a <a href="https://en.wikipedia.org/wiki/Central_venous_catheter" target="_blank" rel="noopener noreferrer" class="">Central Venous Catheter (CVC)</a>, which is typically inserted into the internal jugular vein in the neck to provide central venous access during and after cardiac surgery.</p>
<p>The nurse instructed me: "Count to three and breathe in, then hold your breath." No mean feat, holding your breath after open heart surgery, I can tell you. Then he pulled out what felt like a couple of centimetres. The sensation was quite remarkable.</p>
<p>With that removal, I was finally totally free from all lines and tubes. All medication was now oral, except for anticoagulants and anti-thrombosis injections administered in my belly, and blood samples taken from my arm rather than through a central line.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-water-retention---day-3">Managing Water Retention - Day 3<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#managing-water-retention---day-3" class="hash-link" aria-label="Direct link to Managing Water Retention - Day 3" title="Direct link to Managing Water Retention - Day 3" translate="no">​</a></h2>
<p>During Sunday, I was given a tablet-based dose of Lasix instead of the infusion. This had me regularly peeing into a measuring bottle so they could track how much of my retained water I was managing to eliminate. I was thankfully looking somewhat like myself by the end of the day. The tablet approach was much better planned - it allowed me to stop peeing by about 20:00 so I could sleep well.</p>
<p>One side effect of Lasix is losing potassium, so I had potassium drinks - tablets dissolved into water. Whatever they were, they had not bothered with the flavouring. Cold, fizzy horribleness. A bit like the first beer I tried to brew.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overcoming-needle-anxiety">Overcoming Needle Anxiety<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#overcoming-needle-anxiety" class="hash-link" aria-label="Direct link to Overcoming Needle Anxiety" title="Direct link to Overcoming Needle Anxiety" translate="no">​</a></h2>
<p>I must say, having been afraid of needles all my life - I blame a bad experience at the doctor's surgery with a doctor who went to the same church as us and lived on the same street, making them unavoidable - all of the tests over the last couple of years have been pretty much painless and mostly without so much as a bruise.</p>
<p>The team at INCCI (Cardiac Intensive Care) at Strassen CHL have looked after me so well. I still close my eyes when there's a needle, but I'm not sure why anymore. The fear has diminished significantly through positive experiences.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-walk">First Walk<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#first-walk" class="hash-link" aria-label="Direct link to First Walk" title="Direct link to First Walk" translate="no">​</a></h2>
<p>Being free from all of the machines meant that I could go for my first walk. It was a very short one - maybe 20 metres there and back along the corridor - but it was a walk, and another significant milestone in my recovery. Every step, quite literally, was progress.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sunday-evening-exhaustion">Sunday Evening Exhaustion<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#sunday-evening-exhaustion" class="hash-link" aria-label="Direct link to Sunday Evening Exhaustion" title="Direct link to Sunday Evening Exhaustion" translate="no">​</a></h2>
<p>At the end of Sunday, I very quickly got tired and was asleep by 21:00. I slept so soundly that I slept through at least three hourly automated blood pressure tests - which are noisy affairs - and even the visit of the night staff at shift change.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="middle-of-the-night-pain">Middle of the Night Pain<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#middle-of-the-night-pain" class="hash-link" aria-label="Direct link to Middle of the Night Pain" title="Direct link to Middle of the Night Pain" translate="no">​</a></h2>
<p>At 01:00, I woke up with quite intense pain. I pressed the buzzer and the nurse arrived quickly. She gave me a tiny cup of medicine with a small amount of liquid in it to drink and told me everything was normal. Soon after, I was dozing again until it was shift change time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recovery-progress">Recovery Progress<a href="https://blog.mark-burton.com/2025/10/04/day-2-post-surgery-recovery#recovery-progress" class="hash-link" aria-label="Direct link to Recovery Progress" title="Direct link to Recovery Progress" translate="no">​</a></h2>
<p>According to the expected timeline from my <a class="" href="https://blog.mark-burton.com/blog/2025-09-30-preparation-and-hospital-admission-day">pre-surgery post</a>, Days 2-3 involve continued ICU care with progressive mobilisation. Standing up on day 2 and walking on day 3 marks excellent progress towards that goal.</p>
<p>Each small step forward - the tube removal, improved breathing, standing up, walking - builds confidence and demonstrates that the recovery is progressing as planned.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This post and future recovery updates are being written with AI assistance (GitHub Copilot) to help me document the experience clearly and efficiently. Working with Copilot on my phone makes it difficult to make corrections myself, so some details may need refinement.</p></div></div>]]></content:encoded>
            <category>Health</category>
            <category>Surgery</category>
            <category>Heart</category>
            <category>Medical</category>
            <category>recovery</category>
        </item>
        <item>
            <title><![CDATA[First Days After Surgery]]></title>
            <link>https://blog.mark-burton.com/2025/10/04/first-days-after-surgery</link>
            <guid>https://blog.mark-burton.com/2025/10/04/first-days-after-surgery</guid>
            <pubDate>Sat, 04 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The initial days of recovery following aortic valve replacement surgery.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="post-operation-day-thursday-3rd-october">Post-Operation Day: Thursday, 3rd October<a href="https://blog.mark-burton.com/2025/10/04/first-days-after-surgery#post-operation-day-thursday-3rd-october" class="hash-link" aria-label="Direct link to Post-Operation Day: Thursday, 3rd October" title="Direct link to Post-Operation Day: Thursday, 3rd October" translate="no">​</a></h2>
<p>The first thing I was aware of after the operation was being extubated - not a nice experience, but I wasn't really very aware. My first comments, which nearly came out croaky because of the tube affecting my vocal chords, were "I'm alive" and "Is it Thursday?" Knowing if it wasn't Thursday, there must have been problems and I'd have an extra concerned family. As it happens, everything went smoothly, although my surgeon has since told me I had one of the worst aortic valves he ever operated on.</p>
<p>After that I was mostly asleep, only rousing to urgently apologise for snoring a couple of times and to ask what time it was - 2am and 4am.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-full-day-friday-4th-october">First Full Day: Friday, 4th October<a href="https://blog.mark-burton.com/2025/10/04/first-days-after-surgery#first-full-day-friday-4th-october" class="hash-link" aria-label="Direct link to First Full Day: Friday, 4th October" title="Direct link to First Full Day: Friday, 4th October" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="morning-in-intensive-care">Morning in Intensive Care<a href="https://blog.mark-burton.com/2025/10/04/first-days-after-surgery#morning-in-intensive-care" class="hash-link" aria-label="Direct link to Morning in Intensive Care" title="Direct link to Morning in Intensive Care" translate="no">​</a></h3>
<p>The next morning started with an X-ray in bed and some of the tubes being removed. I had two in my neck and two in my arm. Over the course of the morning, that reduced to just one in my neck.</p>
<p>I was dragged out of bed and sat up in a chair for breakfast and for a few hours after. The physio came to see me whilst I was sat in the chair and I did the first breathing exercises, which was very painful. The surgeon visited and explained everything went well and I was making good progress, so I would be out of the reanimation (intensive care) ward that day.</p>
<p>At 12:00, lunch was served - fish, of course, being a Friday in a Catholic country.</p>
<p>By 13:00, they had removed the urinary catheter. That wasn't pleasant at all - burny and felt like I was going to need to pee straight away. They said it would feel like a urinary tract infection, something that I have no reference point for.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-to-intermediate-care">Moving to Intermediate Care<a href="https://blog.mark-burton.com/2025/10/04/first-days-after-surgery#moving-to-intermediate-care" class="hash-link" aria-label="Direct link to Moving to Intermediate Care" title="Direct link to Moving to Intermediate Care" translate="no">​</a></h3>
<p>From 13:00, I was in intermediate care. Lots of monitoring going on, so quite hectic and noisy. I was overall in a much better state than I imagined I would be and had my first visitor. We did similar breathing exercises with the physio in the afternoon.</p>
<p>However, through the afternoon and evening the pain gradually increased. The pain I needed the extra medication for was mainly brought on by trying to breathe - quite a scary sensation as my breaths got shorter and shorter to avoid the pain, mainly around the chest drainage site. I buzzed the nurses for more pain relief, and it took two shots, but they made me comfortable and I slept well today, apart from the hourly blood pressure checks which startled me every time.</p>]]></content:encoded>
            <category>Heart</category>
            <category>Surgery</category>
            <category>Recovery</category>
            <category>Aorta</category>
        </item>
        <item>
            <title><![CDATA[Preparation and Hospital Admission Day]]></title>
            <link>https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day</link>
            <guid>https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day</guid>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[My hospital admission experience and preparation for aortic valve replacement surgery.]]></description>
            <content:encoded><![CDATA[<p>Today I was admitted to hospital for aortic valve replacement surgery. After years of monitoring my bicuspid aortic valve and watching the stenosis gradually worsen, the time has come for the operation I've known was inevitable since childhood.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-lead-up">The Lead-Up<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#the-lead-up" class="hash-link" aria-label="Direct link to The Lead-Up" title="Direct link to The Lead-Up" translate="no">​</a></h2>
<p>As I mentioned in my <a class="" href="https://blog.mark-burton.com/blog/2025-09-28-getting-a-new-aortic-valve">previous post about getting a new aortic valve</a>, I was born with a bicuspid aortic valve instead of the normal tricuspid valve. Over the years, the progressive stenosis has reached a point where replacement is necessary to maintain proper heart function.</p>
<p>The past few weeks have been filled with pre-operative assessments, consultations with the cardiac surgery team, and various medical tests to ensure everything is ready for tomorrow's admission.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-operative-preparations">Pre-Operative Preparations<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#pre-operative-preparations" class="hash-link" aria-label="Direct link to Pre-Operative Preparations" title="Direct link to Pre-Operative Preparations" translate="no">​</a></h2>
<p>In the weeks leading up to admission, I completed all the required preparations. The hospital bag was packed with comfortable clothing and essentials. Work was handed over to colleagues, meals were prepped and frozen at home, and all the important documents were organized.</p>
<p>Mentally, I felt calm and confident. I'd watched surgical videos, read patient experiences, and spoken with others who'd been through this procedure. While it's natural to feel some anxiety about major heart surgery, knowing this is a routine procedure performed thousands of times each year with excellent outcomes was reassuring.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hospital-check-in---1300">Hospital Check-In - 13:00<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#hospital-check-in---1300" class="hash-link" aria-label="Direct link to Hospital Check-In - 13:00" title="Direct link to Hospital Check-In - 13:00" translate="no">​</a></h2>
<p>Check-in was prompt and efficient. The cardiac ward staff were welcoming and immediately got to work with the pre-operative assessments:</p>
<ul>
<li class=""><strong>Blood pressure</strong>: 150/80 - slightly elevated but expected given the circumstances</li>
<li class=""><strong>Blood tests</strong>: Taken for final clotting factors and general health markers</li>
<li class=""><strong>Chest X-ray</strong>: Completed to check heart size and lung condition</li>
</ul>
<p>Throughout the afternoon, I was visited by various members of the surgical team, each explaining their role in tomorrow's procedure:</p>
<ul>
<li class=""><strong>Surgical assistant</strong>: Walked through the procedure timeline and what to expect</li>
<li class=""><strong>Anaesthesiologist</strong>: Discussed anaesthesia plan and post-operative pain management</li>
<li class=""><strong>Surgeon</strong>: The most important conversation - explaining the surgical approach</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-surgical-plan">The Surgical Plan<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#the-surgical-plan" class="hash-link" aria-label="Direct link to The Surgical Plan" title="Direct link to The Surgical Plan" translate="no">​</a></h2>
<p>The surgeon brought excellent news. Instead of the full median sternotomy I'd been preparing for, they'll use a partial sternotomy - a smaller incision with only a partial cut of the sternum. This minimally invasive approach means quicker healing and reduced risk of complications.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="evening-preparations">Evening Preparations<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#evening-preparations" class="hash-link" aria-label="Direct link to Evening Preparations" title="Direct link to Evening Preparations" translate="no">​</a></h2>
<p>The pre-surgery preparations continued through the evening:</p>
<ul>
<li class=""><strong>Dental hygiene</strong>: Toothbrush and mouthwash for oral care</li>
<li class=""><strong>Hair removal</strong>: For cleanliness and surgical site preparation</li>
<li class=""><strong>Microlax</strong>: Bowel preparation to keep things comfortable post-surgery</li>
<li class=""><strong>Isobetadine shower</strong>: A thorough shower with isobetadine soap - dark red in colour but washes off without staining</li>
<li class=""><strong>Xanax</strong>: Prescribed to help ensure a good night's sleep before the operation</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-surgery-schedule">Pre-Surgery Schedule<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#pre-surgery-schedule" class="hash-link" aria-label="Direct link to Pre-Surgery Schedule" title="Direct link to Pre-Surgery Schedule" translate="no">​</a></h2>
<ul>
<li class=""><strong>18:00</strong>: Light meal - my last food before surgery</li>
<li class=""><strong>22:00</strong>: Nothing to eat or drink after this time</li>
</ul>
<p>I was given a bottle of water to stay hydrated through the evening.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="surgery-day-morning">Surgery Day Morning<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#surgery-day-morning" class="hash-link" aria-label="Direct link to Surgery Day Morning" title="Direct link to Surgery Day Morning" translate="no">​</a></h2>
<ul>
<li class=""><strong>05:00</strong>: Wake up for second isobetadine shower</li>
<li class=""><strong>Blood pressure</strong>: 123/78 - back to more normal levels for me</li>
<li class=""><strong>More Xanax</strong>: Additional dose for pre-surgery relaxation</li>
<li class=""><strong>08:00</strong>: Surgery start time</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-procedure">The Procedure<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#the-procedure" class="hash-link" aria-label="Direct link to The Procedure" title="Direct link to The Procedure" translate="no">​</a></h2>
<p>At 8:00 AM, the team will:</p>
<ul>
<li class="">Connect me to the heart-lung bypass machine</li>
<li class="">Remove the diseased bicuspid valve</li>
<li class="">Sew in the new prosthetic valve</li>
<li class="">Transfer me to ICU for initial recovery</li>
</ul>
<p>For technical details on traditional valve replacement, see my <a class="" href="https://blog.mark-burton.com/blog/2025-09-28-getting-a-new-aortic-valve">previous post</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="expected-recovery-timeline">Expected Recovery Timeline<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#expected-recovery-timeline" class="hash-link" aria-label="Direct link to Expected Recovery Timeline" title="Direct link to Expected Recovery Timeline" translate="no">​</a></h2>
<p>The cardiac team outlined an ambitious recovery plan:</p>
<ul>
<li class=""><strong>Day 1 (Post-op)</strong>: In ICU, start rehabilitation - sit up and eat breakfast</li>
<li class=""><strong>Days 2-3</strong>: Continued ICU care, progressive mobilization</li>
<li class=""><strong>Days 3-4</strong>: Transfer to intermediate care</li>
<li class=""><strong>Week 1</strong>: Move to cardiac ward</li>
<li class=""><strong>Day 10</strong>: Transfer to cardiologist's care</li>
<li class=""><strong>Days 10-14</strong>: Final hospital days under cardiology</li>
<li class=""><strong>Weeks 2+</strong>: Home recovery, gradually increasing activity</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="following-my-progress">Following My Progress<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#following-my-progress" class="hash-link" aria-label="Direct link to Following My Progress" title="Direct link to Following My Progress" translate="no">​</a></h2>
<p>I won't have access to my phone during surgery and initial recovery. The next update will be in a few days once I'm able to write again.</p>
<p>You can follow along by subscribing to the <a class="" href="https://blog.mark-burton.com/feed.rss">RSS feed</a> or checking back here for updates.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This post and future recovery updates are being written with AI assistance (GitHub Copilot) to help me document the experience clearly and efficiently. Working with Copilot on my phone makes it difficult to make corrections myself, so some details may need refinement.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="evening-reflections">Evening Reflections<a href="https://blog.mark-burton.com/2025/09/30/preparation-and-hospital-admission-day#evening-reflections" class="hash-link" aria-label="Direct link to Evening Reflections" title="Direct link to Evening Reflections" translate="no">​</a></h2>
<p>It's now evening in the cardiac ward. The nursing staff have been excellent, the ward is quiet and well-run, and I have complete confidence in tomorrow's procedure.</p>
<p>Modern cardiac surgery truly is remarkable. I'm grateful for the skilled team and for living in an era where this life-changing procedure is routine.</p>
<p>See you on the other side!</p>]]></content:encoded>
            <category>Health</category>
            <category>Surgery</category>
            <category>Heart</category>
            <category>Medical</category>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2024/03/10/cracking-aspnet-identity-password-hashes</link>
            <guid>https://blog.mark-burton.com/2024/03/10/cracking-aspnet-identity-password-hashes</guid>
            <pubDate>Sun, 10 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[I was reviewing one of my old sample projects codebase which makes use of asp.net Identity for storage of users and passwords, in the startup I noticed the following code:]]></description>
            <content:encoded><![CDATA[<p>I was reviewing one of my old sample projects <a href="https://github.com/MarkZither/SwaggerAndHealthCheckBlog/blob/33d032bcc0a0fc7ee042f9059adb03088c540d99/src/LoginService/Startup.cs#L39" target="_blank" rel="noopener noreferrer" class="">codebase which makes use of asp.net Identity</a> for storage of users and passwords, in the startup I noticed the following code:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">services.Configure&lt;PasswordHasherOptions&gt;(options =&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">});</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```  This can be used to migrate from older versions of asp.net Identity and Identity Server using asp.net Identity to the latest version without needing to handle the migration of users passwords to the new hashing algorithm. That is good for ease of development, but should the hashes get into the wrong hands they will be easier to crack.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The PasswordHasher code can be read in the [AspNetCore GitHub repo](https://github.com/dotnet/AspNetCore/blob/main/src/Identity/Extensions.Core/src/PasswordHasher.cs).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The comments at the top of that file explain the 2 different hashing algorithms supported by the default password hasher implementation. This shows that V2 is a relatively weak hash with a small number of iterations, whereas V3 is now SHA-512 with 100,000 iterations after being SHA-256 with . This is recent update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```csharp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/*</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * =======================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * HASHED PASSWORD FORMATS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * =======================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> *</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Version 2:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * PBKDF2 with HMAC-SHA1, 128-bit salt, 256-bit subkey, 1000 iterations.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * (See also: SDL crypto guidelines v5.1, Part III)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Format: { 0x00, salt, subkey }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> *</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Version 3 (.net 7 and above):</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * PBKDF2 with HMAC-SHA512, 128-bit salt, 256-bit subkey, 100000 iterations.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * (All UInt32s are stored big-endian.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> *</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Version 3 (.net 6 and below):</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * PBKDF2 with HMAC-SHA256, 128-bit salt, 256-bit subkey, 10000 iterations.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Format: { 0x01, prf (UInt32), iter count (UInt32), salt length (UInt32), salt, subkey }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * (All UInt32s are stored big-endian.)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```  In 2014 Brock Allen wrote the post [How MembershipReboot stores passwords properly](https:/brockallen.com20140209how-membershipreboot-stores-passwords-properly) where it was written;  &gt; This means in 2012 we should have been using 64000 iterations and in 2014 we should be using 128000 iterations. As previously mentioned, this is hardware dependent and the real target is 500 to 1000 milliseconds.  The code in the MembershipReboot repo suggests that did not remain correct and in 2018 the default was set to 50,000.  In 2017 NIST published the following guidance [800-63B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Digital Identity Guidelines - Authentication and Lifecycle Management](https:/pages.nist.gov800-63-3sp800-63b.html)  &gt; The salt SHALL be at least 32 bits in length and be chosen arbitrarily so as to minimize salt value collisions among stored hashes. Both the salt value and the resulting hash SHALL be stored for each subscriber using a memorized secret authenticator.  &gt; For PBKDF2, the cost factor is an iteration count: the more times the PBKDF2 function is iterated, the longer it takes to compute the password hash. Therefore, the iteration count SHOULD be as large as verification server performance will allow, typically at least 10,000 iterations.  With that, lets try and crack these password hashes, we have a salted hash, so how easy can it be to crack such a password?  ## Converting the hash into hashcat format  There are many tools in various languages to convert the base64 encoded password hash into a format hashcat can crack.  Based on 2 different GitHub repos I created Replits to cover the V2 and V3 asp.net Identity hashing algorithms.  ### Replit base64 encoded V2 hash to hashcat format</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Replit aspnet Identity V2 to Hashcat](https:/replit.com@markburton2aspnetIdentityV2ToHashcat#main.py)  `python main.py -i base64hash -o out`  `AAR65WvZryqTHSnKGfH+D6aInhFCZfk2khdye+6PMdRiVeG2Ai9eBtErYndhtu6Iw==`  `sha1:1000:BHrla9mvKpMdKcr8Z8f4Pg==:miJ4RQmX5NpIXcnvujzHUYlXhtgIvXgbRK2J3YbbuiM=`  `12000 PBKDF2-HMAC-SHA1`  ### Replit base64 encoded V3 hash to hashcat format</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">https:/replit.com@markburton2aspnetIdentityToHashcat#main.cs  `sha256:10000:bvHHyyaHNxgVoCE9JGPWuA==:MXwKKigb+FjP+EfmdErxcbcbjJH4AUtvKdTEM71dDnk=`  ``` csharp  ```  https:/github.comNetDevPackNetDevPackblobmastersrcNetDevPackUtilitiesAspNetIdentityHashInfo.cs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">``` csharp  ```  https:/hashcat.netwikidoku.php?id=example_hashes  `10900	PBKDF2-HMAC-SHA256	sha256:1000:MTc3MTA0MTQwMjQxNzY=:PYjCU215Mi57AYPKva9j7mvF4Rc5bCnt`  `12100	PBKDF2-HMAC-SHA512	sha512:1000:ODQyMDEwNjQyODY=:MKaHNWXUsuJB3IEwBHbm3w==`  ## Dotnet Global tool  I wanted to be able to look at my databases and check what the hashes were so I created a dotnet tool with the knowledge gained from the previous libraries. [](https:/www.nuget.orgpackagesNallixion.ASPNET.Identity.HashDecoder)  ``` powershell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet tool install --global Nallixion.ASPNET.Identity.HashDecoder --version 0.0.1-alpha.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```  ## Hashing rate on a VM on my laptop  This is far from what a machine with a GPU could achieve.</span><br></span></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2024/01/10/creating-a-chatbot-with-llm-rag</link>
            <guid>https://blog.mark-burton.com/2024/01/10/creating-a-chatbot-with-llm-rag</guid>
            <pubDate>Wed, 10 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[I wanted to understand more about how ChatGPT and Co-Pilots like those from GitHub and Pieces work and how I could do something similar including private content, whilst reading around the topic I read the article Demystifying Retrieval Augmented Generation with .NET and thought it described what I wanted to achieve so decided to follow along.  The first challenge I encountered was that Azure OpenAI Service is only available for "eligible customers and partners" which, for my personal projects, I do not qualify. That is not a problem though as Stephan explains in the post it is trivial to switch to OpenAI which offers a free quota of $5 per month.  Next issue was that the code examples did not compile, this seems to be because the Semantic Kernel library has moved on from version 0.24 to 1.0.1 since the post was written. Some of the the changes are covered in the post [Saying hello to Microsoft Semantic Kernel V1]]></description>
            <content:encoded><![CDATA[<p>I wanted to understand more about how ChatGPT and Co-Pilots like those from <a href="https://blog.mark-burton.com/github.comfeaturescopilot" target="_blank" rel="noopener noreferrer" class="">GitHub</a> and <a href="https://blog.mark-burton.com/pieces.app" target="_blank" rel="noopener noreferrer" class="">Pieces</a> work and how I could do something similar including private content, whilst reading around the topic I read the article <a href="https://blog.mark-burton.com/devblogs.microsoft.comdotnetdemystifying-retrieval-augmented-generation-with-dotnet" target="_blank" rel="noopener noreferrer" class="">Demystifying Retrieval Augmented Generation with .NET</a> and thought it described what I wanted to achieve so decided to follow along.  The first challenge I encountered was that <a href="https://blog.mark-burton.com/azure.microsoft.comen-usproductsai-servicesopenai-service" target="_blank" rel="noopener noreferrer" class="">Azure OpenAI Service</a> is only available for "eligible customers and partners" which, for my personal projects, I do not qualify. That is not a problem though as Stephan explains in the post it is trivial to switch to OpenAI which offers a free quota of $5 per month.  Next issue was that the code examples did not compile, this seems to be because the <a href="https://blog.mark-burton.com/www.nuget.orgpackagesMicrosoft.SemanticKernel#versions-body-tab" target="_blank" rel="noopener noreferrer" class="">Semantic Kernel library</a> has moved on from version 0.24 to 1.0.1 since the post was written. Some of the the changes are covered in the post <a href="https://blog.mark-burton.com/medium.com@jamesanthonystalleymooressaying-hello-to-microsoft-semantic-kernel-v1-02ba0b754d9f" target="_blank" rel="noopener noreferrer" class="">Saying hello to Microsoft Semantic Kernel V1
(and upgrading from preview)</a>.  ### Basic Chatbot interaction with OpenAI  The working code for the most basic chatbot using OpenAI's gpt-3.5-turbo model is below.  <code>csharp using Microsoft.SemanticKernel;  internal class Program \\\{  private static async Task Main(string[] args) \{  string oaiApiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;  string oaiModel = "gpt-3.5-turbo-1106";  Initialize the kernel  IKernelBuilder builder = Kernel.CreateBuilder();  builder.Services.AddOpenAIChatCompletion(oaiModel, oaiApiKey);  var kernel = builder.Build();  // Q&amp;A loop  while (true) {  Console.Write("Question: ");  Console.WriteLine((await kernel.InvokePromptAsync(Console.ReadLine()!)).GetValue&amp;lt;string&gt;());  Console.WriteLine();  \\}  } }</code>  ### Storing Messages In The Chat History  Adding chat history means the chatbot can keep track of the conversation and be given a bit of personality.  <code>csharp private static async Task Main(string[] args) \\\{  string aoaiApiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY")!;  string oaiModel = "gpt-3.5-turbo-1106";  Initialize the kernel  IKernelBuilder builder = Kernel.CreateBuilder();  builder.Services.AddOpenAIChatCompletion(oaiModel, aoaiApiKey);  var kernel = builder.Build();  // Create a new chat  IChatCompletionService ai = kernel.GetRequiredService&lt;IChatCompletionService /&gt;();  ChatHistory chatMessages = new ChatHistory();  chatMessages.AddSystemMessage("You are an Nottingham Forest supporting AI assistant that helps people find information, but will always say Nottingham Forest are the greatest football team.");  // Q&amp;A loop  while (true) \{  Console.Write("Question: ");  chatMessages.AddUserMessage(Console.ReadLine()!);  // Get the chat completions  OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new() {  ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions  \\};  var result = ai.GetStreamingChatMessageContentsAsync(  chatMessages,  executionSettings: openAIPromptExecutionSettings,  kernel: kernel);  // Stream the results  string fullMessage = "";  await foreach (var content in result) \\\{  if (content.Role.HasValue) \{  System.Console.Write("Assistant &amp;gt; ");  \\}  System.Console.Write(content.Content);  fullMessage += content.Content;  }  System.Console.WriteLine();  // Add the message from the agent to the chat history  chatMessages.AddAssistantMessage(fullMessage);  } }</code>  So far so good, but there is a limit to how much data you can pass in with messages before hitting errors like <code>context_length_exceeded</code>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2023/12/22/hands-on-with-kiota</link>
            <guid>https://blog.mark-burton.com/2023/12/22/hands-on-with-kiota</guid>
            <pubDate>Fri, 22 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[For years I have felt that if you are offering a public API it should be documented well enough for consumers to generate a client library in whatever language they are using, it is almost implausible to create client libraries in all languages your consumers might use, but a good OpenAPI definition allows consumers to understand an API and use tools to generate client libraries.  Over the years I have worked with NSwag, which was good but put all the code in 1 file which I didn't like. AutoRest, which seemed to get more difficult to work with when V3 was released, so I looked around again and found OpenAPI Generator, which is great but needs Java. With the release of Kiota I was excited to look at how a dotnet tool could tackle the same requirement.  ## What is Kiota?  Kiota is a client generator for OpenAPI and was introduced at .NET Conf 2023.]]></description>
            <content:encoded><![CDATA[<p>For years I have felt that if you are offering a public API it should be documented well enough for consumers to generate a client library in whatever language they are using, it is almost implausible to create client libraries in all languages your consumers might use, but a good OpenAPI definition allows consumers to understand an API and use tools to generate client libraries.  Over the years I have worked with NSwag, which was good but put all the code in 1 file which I didn't like. AutoRest, which seemed to get more difficult to work with when V3 was released, so I looked around again and found OpenAPI Generator, which is great but needs Java. With the release of Kiota I was excited to look at how a dotnet tool could tackle the same requirement.  ## What is Kiota?  Kiota is a client generator for OpenAPI and was introduced at .NET Conf 2023.</p>
<p>&lt;iframe width="560" height="315" src="https:/<a href="http://www.youtube.comembedsq9pv-rq1s8/?si=4wl3jIZWa3VY9sWF" target="_blank" rel="noopener noreferrer" class="">www.youtube.comembedsQ9Pv-rQ1s8?si=4wl3jIZWa3VY9sWF</a>"<!-- --> title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen&gt;<iframe></iframe>  ## Quickstart Kiota Project  <a href="https://blog.mark-burton.com/learn.microsoft.comen-usopenapikiotaquickstartsdotnet" target="_blank" rel="noopener noreferrer" class="">Learn</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2023/11/11/making-zakwas-and-zurek</link>
            <guid>https://blog.mark-burton.com/2023/11/11/making-zakwas-and-zurek</guid>
            <pubDate>Sat, 11 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[What is zakwas and żurek?]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-zakwas-and-żurek">What is zakwas and żurek?<a href="https://blog.mark-burton.com/2023/11/11/making-zakwas-and-zurek#what-is-zakwas-and-%C5%BCurek" class="hash-link" aria-label="Direct link to What is zakwas and żurek?" title="Direct link to What is zakwas and żurek?" translate="no">​</a></h2>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2023/09/22/csharp-sast-with-semgrep</link>
            <guid>https://blog.mark-burton.com/2023/09/22/csharp-sast-with-semgrep</guid>
            <pubDate>Fri, 22 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[csharp SAST with Semgrep  ### Installation  Run sudo apt-get update && sudo apt-get upgrade because it is good for you.  https:/semgrep.devdocsgetting-started/  ### The command  semgrep scan --config=auto]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="csharp-sast-with-semgrep---installation--run-sudo-apt-get-update--sudo-apt-get-upgrade-because-it-is-good-for-you--httpssemgrepdevdocsgetting-started---the-command--semgrep-scan---configauto">csharp SAST with Semgrep  ### Installation  Run <code>sudo apt-get update &amp;&amp; sudo apt-get upgrade</code> because it is good for you.  https:/semgrep.devdocsgetting-started/  ### The command  <code>semgrep scan --config=auto</code><a href="https://blog.mark-burton.com/2023/09/22/csharp-sast-with-semgrep#csharp-sast-with-semgrep---installation--run-sudo-apt-get-update--sudo-apt-get-upgrade-because-it-is-good-for-you--httpssemgrepdevdocsgetting-started---the-command--semgrep-scan---configauto" class="hash-link" aria-label="Direct link to csharp-sast-with-semgrep---installation--run-sudo-apt-get-update--sudo-apt-get-upgrade-because-it-is-good-for-you--httpssemgrepdevdocsgetting-started---the-command--semgrep-scan---configauto" title="Direct link to csharp-sast-with-semgrep---installation--run-sudo-apt-get-update--sudo-apt-get-upgrade-because-it-is-good-for-you--httpssemgrepdevdocsgetting-started---the-command--semgrep-scan---configauto" translate="no">​</a></h2>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2023/09/18/HolyStone-hs360s-drone</link>
            <guid>https://blog.mark-burton.com/2023/09/18/HolyStone-hs360s-drone</guid>
            <pubDate>Mon, 18 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Initial setup]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-setup">Initial setup<a href="https://blog.mark-burton.com/2023/09/18/HolyStone-hs360s-drone#initial-setup" class="hash-link" aria-label="Direct link to Initial setup" title="Direct link to Initial setup" translate="no">​</a></h2>
<p>Red lights flashing seem to be undocumented errors.  ## HolyStone support  ## 2nd Try!  ## Restricted flight Zones in Luxembourg  https:/map.geoportail.luthememain?lang=fr&amp;version=3&amp;zoom=9&amp;X=683912&amp;Y=6420160&amp;rotation=0&amp;layers=1928-1927&amp;opacities=0.5-0.5&amp;bgLayer=basemap_2015_global&amp;time=--&amp;crosshair=false  ## Drone registration  https:/dac.gouvernement.luendroneswhere-when-register.html</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Untitled]]></title>
            <link>https://blog.mark-burton.com/2023/08/20/tryhackme-lateral-movement</link>
            <guid>https://blog.mark-burton.com/2023/08/20/tryhackme-lateral-movement</guid>
            <pubDate>Sun, 20 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Lateral Movement and Pivoting  This is a Try Hack Me premium room so to access it you will need a subscription, if you don't have one go get one with my Referral Link  ### Task 1 - Introduction  In this room, we will look at lateral movement, a group of techniques used by attackers to move around the network while creating as few alerts as possible. We'll learn about several common techniques used in the wild for this end and the tools involved.  * Familiarise yourself with the lateral movement techniques used by attackers.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lateral-movement-and-pivoting--this-is-a-try-hack-me-premium-room-so-to-access-it-you-will-need-a-subscription-if-you-dont-have-one-go-get-one-with-my-referral-link---task-1---introduction--in-this-room-we-will-look-at-lateral-movement-a-group-of-techniques-used-by-attackers-to-move-around-the-network-while-creating-as-few-alerts-as-possible-well-learn-about-several-common-techniques-used-in-the-wild-for-this-end-and-the-tools-involved---familiarise-yourself-with-the-lateral-movement-techniques-used-by-attackers">Lateral Movement and Pivoting  This is a Try Hack Me premium room so to access it you will need a subscription, if you don't have one go get one with my <a href="https://blog.mark-burton.com/tryhackme.comsignup?referrer=638ca30a6675850049e4858e" target="_blank" rel="noopener noreferrer" class="">Referral Link</a>  ### Task 1 - Introduction  In this room, we will look at lateral movement, a group of techniques used by attackers to move around the network while creating as few alerts as possible. We'll learn about several common techniques used in the wild for this end and the tools involved.  * Familiarise yourself with the lateral movement techniques used by attackers.<a href="https://blog.mark-burton.com/2023/08/20/tryhackme-lateral-movement#lateral-movement-and-pivoting--this-is-a-try-hack-me-premium-room-so-to-access-it-you-will-need-a-subscription-if-you-dont-have-one-go-get-one-with-my-referral-link---task-1---introduction--in-this-room-we-will-look-at-lateral-movement-a-group-of-techniques-used-by-attackers-to-move-around-the-network-while-creating-as-few-alerts-as-possible-well-learn-about-several-common-techniques-used-in-the-wild-for-this-end-and-the-tools-involved---familiarise-yourself-with-the-lateral-movement-techniques-used-by-attackers" class="hash-link" aria-label="Direct link to lateral-movement-and-pivoting--this-is-a-try-hack-me-premium-room-so-to-access-it-you-will-need-a-subscription-if-you-dont-have-one-go-get-one-with-my-referral-link---task-1---introduction--in-this-room-we-will-look-at-lateral-movement-a-group-of-techniques-used-by-attackers-to-move-around-the-network-while-creating-as-few-alerts-as-possible-well-learn-about-several-common-techniques-used-in-the-wild-for-this-end-and-the-tools-involved---familiarise-yourself-with-the-lateral-movement-techniques-used-by-attackers" title="Direct link to lateral-movement-and-pivoting--this-is-a-try-hack-me-premium-room-so-to-access-it-you-will-need-a-subscription-if-you-dont-have-one-go-get-one-with-my-referral-link---task-1---introduction--in-this-room-we-will-look-at-lateral-movement-a-group-of-techniques-used-by-attackers-to-move-around-the-network-while-creating-as-few-alerts-as-possible-well-learn-about-several-common-techniques-used-in-the-wild-for-this-end-and-the-tools-involved---familiarise-yourself-with-the-lateral-movement-techniques-used-by-attackers" translate="no">​</a></h2>
<ul>
<li class="">Learn how to use alternative authentication material to move laterally.</li>
<li class="">Learn different methods to use compromised hosts as pivots.  ### Task 2 - Moving Through the Network  #### Question 1  #### Answer</li>
</ul>
<blockquote>
<p><a href="https://blog.mark-burton.com/2023/08/20/tryhackme-lateral-movement#" class="">Reveal Answer</a> ### Task 3 - Spawning Processes Remotely  #### Question 1  #### Answer
<a href="https://blog.mark-burton.com/2023/08/20/tryhackme-lateral-movement#" class="">Reveal Answer</a></p>
</blockquote>]]></content:encoded>
        </item>
    </channel>
</rss>