<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kirk Keel</title>
    <description>The latest articles on DEV Community by Kirk Keel (@greybeard00007).</description>
    <link>https://dev.to/greybeard00007</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4227626%2F150fbfea-943b-498b-baf0-aa77b97fc225.jpg</url>
      <title>DEV Community: Kirk Keel</title>
      <link>https://dev.to/greybeard00007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/greybeard00007"/>
    <language>en</language>
    <item>
      <title>Why Standard Rounding Fails in Well Control: Directional Rounding in IADC Safety Standards</title>
      <dc:creator>Kirk Keel</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:42:35 +0000</pubDate>
      <link>https://dev.to/greybeard00007/why-standard-rounding-fails-in-well-control-directional-rounding-in-iadc-safety-standards-3fll</link>
      <guid>https://dev.to/greybeard00007/why-standard-rounding-fails-in-well-control-directional-rounding-in-iadc-safety-standards-3fll</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published with interactive math formulas and diagrams at &lt;a href="https://eng.kcklayton.com/blog/why-standard-rounding-fails-in-well-control/" rel="noopener noreferrer"&gt;eng.kcklayton.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In general software engineering, floating-point numbers are rounded to the nearest integer or decimal using standard commercial rounding ($0.5$ rounds up, $0.49$ rounds down). In everyday applications, this minimizes cumulative bias.&lt;/p&gt;

&lt;p&gt;In well control and drilling operations, &lt;strong&gt;round-to-nearest is an unacceptable hazard&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When drilling thousands of feet into high-pressure subsurface formations, rounding standard formulas in the wrong direction can either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Underbalance the well&lt;/strong&gt;, allowing formation gas or oil to continue influxing into the wellbore, or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overestimate the casing shoe fracture resistance&lt;/strong&gt;, risking formation breakdown and catastrophic underground blowouts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this reason, the International Association of Drilling Contractors (&lt;strong&gt;IADC WellSharp&lt;/strong&gt;) and the International Well Control Forum (&lt;strong&gt;IWCF&lt;/strong&gt;) strictly enforce &lt;strong&gt;directional rounding rules&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Operational Safety Principles of Directional Rounding
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Principle 1: Hydrostatic Safety Margin (Underbalance Prevention)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule:&lt;/strong&gt; Calculated kill mud weights and circulating pressures are strictly &lt;strong&gt;rounded UP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rationale:&lt;/strong&gt; If your calculated Kill Mud Weight (KMW) requires $13.01\text{ ppg}$, rounding to the nearest tenth yields $13.0\text{ ppg}$. At $14,000\text{ ft TVD}$, that missing $0.01\text{ ppg}$ corresponds to an underbalance of:
$$\Delta P = 0.052 \times 0.01 \times 14,000 = 7.28\text{ psi}$$
A $7.3\text{ psi}$ underbalance means the formation pore pressure exceeds bottomhole hydrostatic pressure, and the kick will continue flowing into the wellbore. Rounding &lt;strong&gt;UP&lt;/strong&gt; to $13.1\text{ ppg}$ guarantees a positive overbalance barrier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Principle 2: Fracture Safety Margin (Shoe Breakdown Prevention)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule:&lt;/strong&gt; Formation integrity limits, Leak-Off Test (LOT) equivalent mud weights, and Maximum Allowable Annular Surface Pressure (MAASP) are strictly &lt;strong&gt;rounded DOWN&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rationale:&lt;/strong&gt; Overestimating the formation breakdown gradient at the weakest exposed formation (usually the casing shoe) can cause the driller to exceed fracture pressure during a well kill, leading to lost circulation and an uncontrolled broach to the surface.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Principle 3: The Golden Carry-Forward Rule
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rule:&lt;/strong&gt; When a calculated value (such as Kill Mud Weight or Maximum Allowable Mud Weight) is used as an input to subsequent equations on the kill sheet, the &lt;strong&gt;already-rounded value must be carried forward&lt;/strong&gt; into all downstream formulas, not the unrounded raw float.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Mathematical Summary of IADC WellSharp Rules
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;IADC Formula&lt;/th&gt;
&lt;th&gt;Field Units Rule&lt;/th&gt;
&lt;th&gt;Metric Units Rule&lt;/th&gt;
&lt;th&gt;Operational Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kill Mud Weight (KMW)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\text{MW} + \frac{\text{SIDPP}}{0.052 \times \text{TVD}}$&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND UP&lt;/strong&gt; to &lt;strong&gt;0.1 ppg&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND UP&lt;/strong&gt; to &lt;strong&gt;0.01 kg/L&lt;/strong&gt; (or whole $\text{kg/m}^3$)&lt;/td&gt;
&lt;td&gt;Prevents formation kick from flowing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LOT / MAMW&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\text{Test MW} + \frac{\text{Surface LOT}}{0.052 \times \text{Shoe TVD}}$&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;0.1 ppg&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;0.01 kg/L&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Prevents overestimating shoe fracture strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MAASP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$(\text{MAMW} - \text{MW}) \times 0.052 \times \text{Shoe TVD}$&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;whole psi&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;0.1 bar&lt;/strong&gt; (or whole kPa)&lt;/td&gt;
&lt;td&gt;Upper surface limit to protect open-hole shoe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initial Circulating Pressure (ICP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\text{SIDPP} + \text{SCRP}$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Whole psi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.1 bar&lt;/strong&gt; (or whole kPa)&lt;/td&gt;
&lt;td&gt;Starting pump pressure at kill rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Final Circulating Pressure (FCP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\text{SCRP} \times \frac{\text{KMW}}{\text{MW}}$&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND UP&lt;/strong&gt; to &lt;strong&gt;whole psi&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0.1 bar&lt;/strong&gt; (or whole kPa)&lt;/td&gt;
&lt;td&gt;Preserves overbalance with kill mud at bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pressure Drop per 100 Strokes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\frac{(\text{ICP} - \text{FCP}) \times 100}{\text{Strokes to Bit}}$&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;whole psi/100 stks&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ROUND DOWN&lt;/strong&gt; to &lt;strong&gt;0.01 bar/100 stks&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Step-down drillpipe schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Implementation Pitfalls: IEEE-754 Epsilon Guards
&lt;/h2&gt;

&lt;p&gt;When translating directional rounding into code, relying purely on &lt;code&gt;Math.ceil(rawVal * 10) / 10&lt;/code&gt; introduces subtle IEEE-754 binary floating-point representation anomalies.&lt;/p&gt;

&lt;p&gt;For example, in standard JavaScript / Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Floating point representation issue:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;13.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.000000000000002&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Result: 13.1 (INCORRECT! 13.0 was incremented!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To guard against floating-point representation leaks, our calculation engine introduces a dedicated epsilon offset (&lt;code&gt;1e-9&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Safe directional rounding implementation in 5KR Kill Sheet:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawKmw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mw&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sidpp&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.052&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tvd&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;kmw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;rawKmw&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// LOT / MAMW truncated down to 0.1 ppg:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawMamw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strength&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lotMw&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lotP&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.052&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shoeTvd&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fg&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.052&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mamw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;rawMamw&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// MAASP carrying forward the rounded MAMW:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawMaasp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mamw&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.052&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;shoeTvd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;maasp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawMaasp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Impact on MAASP: A 34 psi Safety Margin
&lt;/h3&gt;

&lt;p&gt;Consider a real-world horizontal lateral kick scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current Mud Weight: $12.4\text{ ppg}$&lt;/li&gt;
&lt;li&gt;Surface Leak-Off Test: $1,149\text{ psi}$ with $12.4\text{ ppg}$ test mud at $6,500\text{ ft TVD}$ casing shoe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$$\text{Raw MAMW} = 12.4 + \frac{1,149}{0.052 \times 6,500} = 15.7994\dots\text{ ppg}$$&lt;/p&gt;

&lt;p&gt;Under standard commercial rounding, $15.7994\text{ ppg}$ rounds up to $15.8\text{ ppg}$. &lt;br&gt;
Under strict IADC WellSharp rules, it is &lt;strong&gt;truncated down to $15.7\text{ ppg}$&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When computing MAASP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unrounded / Commercial:&lt;/strong&gt; $(15.8 - 12.4) \times 0.052 \times 6,500 = 1,149.2 \approx \mathbf{1,149\text{ psi}}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IADC Directional (Carried Forward):&lt;/strong&gt; $(15.7 - 12.4) \times 0.052 \times 6,500 = 1,115.4 \rightarrow \mathbf{1,115\text{ psi}}$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The IADC directional rounding rules provide a &lt;strong&gt;$34\text{ psi}$ physical buffer&lt;/strong&gt;, ensuring that surface choke operators will never unintentionally break down the formation shoe during the kill circulation.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Live Verification &amp;amp; Automated Testing
&lt;/h2&gt;

&lt;p&gt;This complete directional calculation engine is live on the web at &lt;a href="https://kill.kcklayton.com" rel="noopener noreferrer"&gt;&lt;strong&gt;kill.kcklayton.com&lt;/strong&gt;&lt;/a&gt;, running interactive stroke step-down schedules, dynamic choke tracking, and PDF kill sheet generation.&lt;/p&gt;

&lt;p&gt;The calculation logic is verified across 12 automated unit tests checking IADC decimal places, Field and Metric unit conversions, and floating-point edge cases. You can inspect the source code and run the test suite on GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/Greybeard00007/5kr-kill-sheet" rel="noopener noreferrer"&gt;&lt;strong&gt;github.com/Greybeard00007/5kr-kill-sheet&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wellcontrol</category>
      <category>iadcwellsharp</category>
      <category>drillingengineering</category>
      <category>safetycritical</category>
    </item>
    <item>
      <title>Air-Gapped Rig-Edge WITSML Telemetry with Local Small Language Models (SLMs)</title>
      <dc:creator>Kirk Keel</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:42:33 +0000</pubDate>
      <link>https://dev.to/greybeard00007/air-gapped-rig-edge-witsml-telemetry-with-local-small-language-models-slms-165m</link>
      <guid>https://dev.to/greybeard00007/air-gapped-rig-edge-witsml-telemetry-with-local-small-language-models-slms-165m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published with interactive math formulas and diagrams at &lt;a href="https://eng.kcklayton.com/blog/rig-edge-witsml-local-slm-telemetry/" rel="noopener noreferrer"&gt;eng.kcklayton.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Drilling rigs—whether stationed offshore in deepwater or operating across remote onshore basins—share a common operational reality: &lt;strong&gt;high-latency, bandwidth-constrained, and intermittent satellite connectivity (VSAT)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Round-trip satellite pings routinely exceed $600\text{ to }1200\text{ ms}$, with atmospheric attenuation or antenna line-of-sight blockage causing frequent dropouts. When a high-pressure gas influx (kick) enters the wellbore, or when a bottom-hole assembly (BHA) experiences catastrophic stick-slip oscillation, seconds count. Routing real-time sensor telemetry to a remote cloud datacenter for LLM inference or anomaly classification introduces unacceptable operational latency and single-point-of-failure exposure.&lt;/p&gt;

&lt;p&gt;To solve this, our drilling architecture decouples real-time rig surveillance into an &lt;strong&gt;Air-Gapped Edge Intelligence Stack&lt;/strong&gt; running local deterministic filters and quantized Small Language Models (SLMs) directly on rig-site hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Architectural Challenge: The Edge Telemetry Firehose
&lt;/h2&gt;

&lt;p&gt;Modern drilling rigs generate high-frequency telemetry across dozens of channels via the &lt;strong&gt;WITSML&lt;/strong&gt; (Wellsite Information Transfer Standard Markup Language) and &lt;strong&gt;WITS&lt;/strong&gt; (Wellsite Information Transfer Specification) standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Surface Parameters:&lt;/strong&gt; Hookload, Standpipe Pressure (SPP), Surface Torque, Rotary RPM, Pit Volume Total (PVT), Flow Out percentage, Mud Gas concentration ($C_1 - C_5$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downhole MWD/LWD:&lt;/strong&gt; Continuous Inclination/Azimuth, Gamma Ray, Annular Pressure While Drilling (PWD), Dynamic Shock and Vibration.
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    subgraph RigFloor["Rig Floor &amp;amp; PWD Instrumentation"]
        Sensors["Rig Sensors (Flow, SPP, Pit, Hookload)"]
        PWD["Downhole MWD / PWD Telemetry"]
    end

    subgraph RigEdge["Edge Server (Rig Doghouse / Rig Server Room)"]
        WITSMLAgent["WITSML Edge Agent&amp;lt;br/&amp;gt;(1-sec Poller &amp;amp; In-Memory Ring Buffer)"]
        MathEngine["Deterministic Physics Filters&amp;lt;br/&amp;gt;(Flow In/Out Differential, Pit Rate)"]
        LocalSLM["Local SLM Inference Engine&amp;lt;br/&amp;gt;(Ollama / llama.cpp - Qwen / Mistral)"]
        RigDisplay["Local Rig Doghouse Alarm &amp;amp; HMI"]
    end

    subgraph RemoteCloud["Corporate Headquarters / Real-Time Operations Center (RTOC)"]
        CloudMesh["Event-Driven Telemetry Mesh"]
        RemoteDashboard["Engineering Dashboard"]
    end

    Sensors --&amp;gt;|WITS / WITSML| WITSMLAgent
    PWD --&amp;gt;|Mud Pulse / EM| WITSMLAgent
    WITSMLAgent --&amp;gt; MathEngine
    MathEngine --&amp;gt;|Anomaly Context Window| LocalSLM
    LocalSLM --&amp;gt;|Sub-second Triage &amp;amp; Root Cause| RigDisplay
    WITSMLAgent -.-&amp;gt;|Async Delta Sync via VSAT (When Online)| CloudMesh
    CloudMesh -.-&amp;gt; RemoteDashboard&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Why Cloud-Only AI Fails on Rigs:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Network Blackouts:&lt;/strong&gt; Severe storms or satellite handoffs cut off connection right during critical tripping or drilling phases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth Costs &amp;amp; Saturation:&lt;/strong&gt; Raw 10Hz/1Hz multi-channel telemetry streams saturate satellite uplinks needed for drilling engineering conferences and logistics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency Jitter:&lt;/strong&gt; A prompt round-trip to an external API (like GPT-4o or Claude) takes $2\text{ to }5\text{ seconds}$ under ideal satellite conditions, and times out entirely under packet loss.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Real-Time Deterministic Filtering + SLM Hybrid
&lt;/h2&gt;

&lt;p&gt;Language models should never replace basic physics calculations. Calculating flow differential ($\Delta Q = Q_{\text{out}} - Q_{\text{in}}$) or standpipe pressure derivatives ($\frac{dP}{dt}$) requires deterministic arithmetic, not probabilistic token generation.&lt;/p&gt;

&lt;p&gt;The edge agent runs a &lt;strong&gt;two-tier architecture&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1: Deterministic Real-Time Anomaly Windowing
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/Greybeard00007/witsml-edge-agent" rel="noopener noreferrer"&gt;&lt;code&gt;witsml-edge-agent&lt;/code&gt;&lt;/a&gt; maintains a rolling in-memory ring buffer (defaulting to 300 seconds of 1-second records). A high-speed Rust/Python physics worker evaluates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate of Penetration (ROP) Break Detection:&lt;/strong&gt; Sudden acceleration in ROP without corresponding weight-on-bit (WOB) increase (drilling break).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pit Gain Rate:&lt;/strong&gt; Positive slope in active pit volume $&amp;gt; 5\text{ bbl/min}$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow-Out vs. Pump Rate Incongruence:&lt;/strong&gt; Flow sensor reading $&amp;gt; 0$ while rig pumps are off, or positive deviation exceeding baseline threshold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tier 2: Edge-Local SLM Contextual Triage
&lt;/h3&gt;

&lt;p&gt;When Tier 1 triggers an anomaly condition, it compiles a structured JSON context payload capturing the pre-event baseline, trigger metrics, current rig state (drilling, tripping, circulating, reaming), and recent downhole events.&lt;/p&gt;

&lt;p&gt;This payload is dispatched via localhost IPC to &lt;a href="https://github.com/Greybeard00007/ai-gateway-sentinel" rel="noopener noreferrer"&gt;&lt;code&gt;ai-gateway-sentinel&lt;/code&gt;&lt;/a&gt;, which interfaces directly with an embedded Ollama or &lt;code&gt;llama.cpp&lt;/code&gt; instance running a quantized $7\text{B}$ or $3\text{B}$ parameter model (e.g., &lt;code&gt;mistral-7b-instruct-q4_K_M&lt;/code&gt; or &lt;code&gt;qwen2.5-coder-7b&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Implementation: Fast Edge WITSML Anomaly Dispatch
&lt;/h2&gt;

&lt;p&gt;Here is how the edge agent structures the telemetry window and queries the local edge engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TelemetryPoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;depth_ft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;rop_fph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;spp_psi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;flow_out_pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;pit_total_bbl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;pumps_active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RigEdgeAnomalyDetector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ollama_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:11434&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TelemetryPoint&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_buffer_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ollama_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama_url&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anomaly_cooldown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TelemetryPoint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_buffer_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Require at least 30 seconds of stable baseline
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="c1"&gt;# Deterministic trigger checks
&lt;/span&gt;        &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
        &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;avg_baseline_pit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pit_total_bbl&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;current_pit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;pit_total_bbl&lt;/span&gt;
        &lt;span class="n"&gt;pit_gain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_pit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;avg_baseline_pit&lt;/span&gt;

        &lt;span class="c1"&gt;# Condition: Flowing with pumps off, or pit gain &amp;gt; 10 bbl
&lt;/span&gt;        &lt;span class="n"&gt;flow_anomaly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;pumps_active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;flow_out_pct&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;kick_indicator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pit_gain&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;

        &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flow_anomaly&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;kick_indicator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anomaly_cooldown&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anomaly_cooldown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="c1"&gt;# Cooldown to avoid prompt flooding
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_triage_with_local_slm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pit_gain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flow_anomaly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anomaly_cooldown&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anomaly_cooldown&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_triage_with_local_slm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TelemetryPoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pit_gain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flow_anomaly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;[RIG ALARM TRIAGE - HIGH PRIORITY]
You are a senior drilling superintendent and well control advisor running on an edge rig computer.
Current Telemetry:
- Hole Depth: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;depth_ft&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; ft
- Standpipe Pressure: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spp_psi&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; psi
- Pumps Active: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pumps_active&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
- Flow Out: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flow_out_pct&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%
- Total Pit Gain: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pit_gain&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bbl
- Flow Anomaly Flag: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;flow_anomaly&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Provide a concise, 3-bullet assessment:
1. Probable Root Cause (e.g., Formation Influx vs. Pit Transfer vs. Sensor Drift)
2. Immediate Verification Step for Driller (e.g., Space out and perform flow check)
3. Well Control Level (Green / Yellow / Red Alert)
Format response as strictly actionable guidance for the rig crew.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ollama_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/api/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral:7b-instruct-q4_K_M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALERT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assessment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Deterministic failsafe if local inference times out
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALERT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assessment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LOCAL SLM TIMEOUT - EXECUTE FLOW CHECK IMMEDIATELY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALERT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assessment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UNVERIFIED ANOMALY - INITIATE FLOW CHECK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Benchmark Performance on Industrial Edge Hardware
&lt;/h2&gt;

&lt;p&gt;Testing deployed on an industrial fanless rig-floor edge PC (Intel Core i7-12700E, 32GB DDR5, running Ubuntu Core 24.04 LTS):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model / Quantization&lt;/th&gt;
&lt;th&gt;Parameter Size&lt;/th&gt;
&lt;th&gt;Memory Footprint&lt;/th&gt;
&lt;th&gt;Edge Inference Latency&lt;/th&gt;
&lt;th&gt;Deterministic Filter Latency&lt;/th&gt;
&lt;th&gt;Cloud Round-Trip (VSAT)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deterministic Rule Filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;$&amp;lt; 40\text{ MB}$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.4\text{ ms}$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen 2.5 3B (Q4_K_M)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3.1\text{B}$&lt;/td&gt;
&lt;td&gt;$1.9\text{ GB}$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$210\text{ ms}$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$+0.4\text{ ms}$&lt;/td&gt;
&lt;td&gt;$1,800\text{ ms}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral 7B Instruct (Q4_K_M)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$7.2\text{B}$&lt;/td&gt;
&lt;td&gt;$4.4\text{ GB}$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$490\text{ ms}$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$+0.4\text{ ms}$&lt;/td&gt;
&lt;td&gt;$2,100\text{ ms}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 3.1 8B (Q4_K_M)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$8.0\text{B}$&lt;/td&gt;
&lt;td&gt;$4.9\text{ GB}$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$580\text{ ms}$&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$+0.4\text{ ms}$&lt;/td&gt;
&lt;td&gt;$2,300\text{ ms}$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By running locally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;$4\times$ to $10\times$ faster response times&lt;/strong&gt; than any cloud-routed API over satellite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$100\%$ availability guarantee&lt;/strong&gt;—the system operates seamlessly even if the rig's satellite dish is iced over or misaligned during severe weather.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cloud transmission costs&lt;/strong&gt; for raw 1-second drilling channels. Only verified summary events and compressed snapshots are synced back to the real-time operations center (RTOC) when the link restores.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Summary &amp;amp; Ecosystem Integration
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/Greybeard00007/witsml-edge-agent" rel="noopener noreferrer"&gt;&lt;code&gt;witsml-edge-agent&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/Greybeard00007/ai-gateway-sentinel" rel="noopener noreferrer"&gt;&lt;code&gt;ai-gateway-sentinel&lt;/code&gt;&lt;/a&gt; work alongside our &lt;a href="https://github.com/Greybeard00007/kill-sheet-calculations" rel="noopener noreferrer"&gt;&lt;code&gt;kill-sheet-calculations&lt;/code&gt;&lt;/a&gt; library. When a kick is verified, the edge agent can automatically push shut-in drillpipe pressure (SIDPP), shut-in casing pressure (SICP), and pit volume gain into the kill calculation engine, rendering a fully populated, IADC-compliant kill sheet within seconds of well shut-in.&lt;/p&gt;

</description>
      <category>witsml</category>
      <category>rigedge</category>
      <category>slm</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Multiphase Gas Kick Migration vs. The Driller's Method: Dynamic Simulation &amp; Non-Ideal Gas Expansion</title>
      <dc:creator>Kirk Keel</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:36:19 +0000</pubDate>
      <link>https://dev.to/greybeard00007/multiphase-gas-kick-migration-vs-the-drillers-method-dynamic-simulation-non-ideal-gas-expansion-2cjj</link>
      <guid>https://dev.to/greybeard00007/multiphase-gas-kick-migration-vs-the-drillers-method-dynamic-simulation-non-ideal-gas-expansion-2cjj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published with interactive math formulas and diagrams at &lt;a href="https://eng.kcklayton.com/blog/multiphase-gas-kick-migration-dynamics/" rel="noopener noreferrer"&gt;eng.kcklayton.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When taking a kick while drilling, one of the most dangerous assumptions an engineer or driller can make is treating an influx of natural gas as an incompressible fluid or assuming ideal gas behavior.&lt;/p&gt;

&lt;p&gt;Natural gas (primarily methane, $\text{CH}_4$) under high downhole pressures ($5,000\text{ to }15,000\text{ psi}$) and high temperatures ($150^\circ\text{F to }350^\circ\text{F}$) behaves as a dense supercritical fluid. Its volume changes very little as it ascends from $15,000\text{ ft}$ to $5,000\text{ ft}$. However, as it approaches the surface, &lt;strong&gt;expansion accelerates exponentially&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we examine the physics of non-ideal gas expansion, casing shoe pressure dynamics during circulation, and how our multiphase numerical engine in &lt;a href="https://wellsim.kcklayton.com" rel="noopener noreferrer"&gt;&lt;strong&gt;WellSim&lt;/strong&gt;&lt;/a&gt; solves these equations in real time.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Real Gas Law &amp;amp; The Critical $Z$-Factor
&lt;/h2&gt;

&lt;p&gt;The volume of a gas kick at any depth in the wellbore is governed by the non-ideal Real Gas Law:&lt;/p&gt;

&lt;p&gt;$$P V = Z n R T \quad \implies \quad V(P, T) = \frac{Z(P, T) n R T}{P}$$&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$P$ = Absolute downhole pressure ($\text{psi}$)&lt;/li&gt;
&lt;li&gt;$V$ = Influx volume ($\text{bbl}$ or $\text{ft}^3$)&lt;/li&gt;
&lt;li&gt;$Z$ = Compressibility factor (dimensionless deviation from ideal gas)&lt;/li&gt;
&lt;li&gt;$n$ = Moles of gas&lt;/li&gt;
&lt;li&gt;$R$ = Universal gas constant&lt;/li&gt;
&lt;li&gt;$T$ = Absolute temperature ($^\circ\text{R}$)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         Gas Volume Expansion vs. Depth Profile
Depth (ft)
   0 |------------------------------------------&amp;gt; [Violent Expansion: 50+ bbl]
     |                                      /
2,000|                                     /
     |                                   /
4,000|                                  /
     |                                /
6,000|                               |
     |                              |
8,000|                             |
     |                             |  [Dense Supercritical Phase: ~10 bbl]
10,000|                             |
     +-------------------------------------------&amp;gt;
     0                             20            40            60
                            Annular Volume (bbl)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At deep reservoir conditions ($P &amp;gt; 6,000\text{ psi}$), molecular repulsive forces dominate, making the gas less compressible ($Z &amp;gt; 1.0$). As the gas migrates toward the surface, $P$ drops. At intermediate pressures ($1,500 - 3,000\text{ psi}$), attractive intermolecular forces peak ($Z$ drops as low as $0.65 - 0.75$).&lt;/p&gt;

&lt;p&gt;Once the bubble crosses above the $2,000\text{ ft}$ threshold, pressure drops below $1,000\text{ psi}$, and the term $\frac{1}{P}$ explodes. A $10\text{ bbl}$ bottomhole kick can expand into &lt;strong&gt;over $80\text{ to }120\text{ bbl}$ of gas&lt;/strong&gt; by the time it reaches the surface BOP choke line.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Casing Shoe Pressure Dynamics: Peak Fracture Risk
&lt;/h2&gt;

&lt;p&gt;During a well kill, the primary objective is to maintain bottomhole pressure ($P_{\text{BHP}}$) slightly above formation pore pressure while never exceeding the fracture breakdown pressure of the weakest exposed rock—almost always at the &lt;strong&gt;last casing shoe depth&lt;/strong&gt; ($D_{\text{shoe}}$).&lt;/p&gt;

&lt;h3&gt;
  
  
  When Does Casing Shoe Pressure Peak?
&lt;/h3&gt;

&lt;p&gt;In a typical vertical or deviated well, casing shoe pressure $P_{\text{shoe}}$ does &lt;strong&gt;not&lt;/strong&gt; peak at shut-in, nor when gas reaches the surface. &lt;strong&gt;Shoe pressure reaches its absolute maximum when the top of the gas influx arrives directly at the casing shoe depth.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;$$\begin{aligned}&lt;br&gt;
P_{\text{shoe}}(t) &amp;amp;= P_{\text{surface_casing}}(t) + \int_{0}^{D_{\text{shoe}}} \rho_{\text{ann}}(z, t) \, g \, dz \&lt;br&gt;
&amp;amp;= P_{\text{BHP}} - \int_{D_{\text{shoe}}}^{D_{\text{total}}} \rho_{\text{ann}}(z, t) \, g \, dz&lt;br&gt;
\end{aligned}$$&lt;/p&gt;

&lt;p&gt;As the gas column transitions from below the shoe to above the shoe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Below the shoe: Low-density gas replaces heavy drilling mud in the open hole. To keep bottomhole pressure constant, surface casing choke pressure must rise, increasing pressure against the shoe.&lt;/li&gt;
&lt;li&gt;Once the gas enters the cased hole above the shoe: Heavy mud remains below the shoe in the open hole, stabilizing or decreasing the net stress against the exposed formation.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  3. Driller's Method vs. Wait &amp;amp; Weight: Dynamic Comparison
&lt;/h2&gt;

&lt;p&gt;The two standard IADC constant bottomhole pressure methods differ significantly in casing shoe stress and operational complexity:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    subgraph DrillersMethod["Driller's Method (Two Circulations)"]
        D1["Circulation 1: Circulate gas kick out using Original Mud Weight (OMW)"]
        D2["Maintain Drill Pipe Pressure constant at ICP until gas is vented"]
        D3["Circulation 2: Pump Kill Mud Weight (KMW) to balance formation"]
    end

    subgraph WaitAndWeight["Wait &amp;amp; Weight Method (One Circulation)"]
        W1["Wait: Weigh up mud pits to Kill Mud Weight (KMW)"]
        W2["Circulate: Pump KMW while gas kick is ascending simultaneously"]
        W3["Drillpipe pressure follows step-down schedule from ICP to FCP"]
    end

    D1 --&amp;gt; D2 --&amp;gt; D3
    W1 --&amp;gt; W2 --&amp;gt; W3&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Comparison Matrix:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operational Metric&lt;/th&gt;
&lt;th&gt;Driller's Method&lt;/th&gt;
&lt;th&gt;Wait &amp;amp; Weight (Engineer's)&lt;/th&gt;
&lt;th&gt;Operational Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reaction Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Immediate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delayed (must mix mud)&lt;/td&gt;
&lt;td&gt;Driller's method prevents gas migration during shut-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Casing Shoe Pressure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Higher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lower (by $100 - 400\text{ psi}$)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;W&amp;amp;W introduces heavy mud into drillstring and annulus earlier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Surface Choke Pressure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Moderately Lower&lt;/td&gt;
&lt;td&gt;W&amp;amp;W reduces surface equipment stress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calculation Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (Hold SIDPP/ICP)&lt;/td&gt;
&lt;td&gt;High (Requires exact stroke step-down chart)&lt;/td&gt;
&lt;td&gt;Higher probability of human error on the choke console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Circulation Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$\approx 2 \times$ Annular Volume&lt;/td&gt;
&lt;td&gt;$\approx 1.2 \times$ Annular Volume&lt;/td&gt;
&lt;td&gt;W&amp;amp;W clears well faster once pumping starts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. How WellSim Solves the Multiphase Drift-Flux Equations
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://wellsim.kcklayton.com" rel="noopener noreferrer"&gt;WellSim&lt;/a&gt;, the wellbore is discretized into $N$ spatial cells along the measured depth $s$. For each cell $i$, the engine tracks mass conservation of the liquid mud phase and free gas phase:&lt;/p&gt;

&lt;p&gt;$$\frac{\partial}{\partial t} \left( \alpha_g \rho_g \right) + \frac{\partial}{\partial s} \left( \alpha_g \rho_g v_g \right) = \Gamma_g$$&lt;/p&gt;

&lt;p&gt;$$\frac{\partial}{\partial t} \left( \alpha_l \rho_l \right) + \frac{\partial}{\partial s} \left( \alpha_l \rho_l v_l \right) = -\Gamma_g$$&lt;/p&gt;

&lt;p&gt;Where $\alpha_g$ is gas holdup ($0 \le \alpha_g \le 1$), $\rho$ is phase density, and the gas slip velocity $v_g$ relative to liquid velocity $v_l$ is governed by the &lt;strong&gt;Zuber-Findlay drift-flux relation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;$$v_g = C_0 v_m + v_d$$&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$C_0$ is the profile distribution parameter ($\approx 1.2$ for turbulent pipe/annular flow)&lt;/li&gt;
&lt;li&gt;$v_m = \alpha_g v_g + \alpha_l v_l$ is the mixture superficial velocity&lt;/li&gt;
&lt;li&gt;$v_d$ is the buoyant slip velocity of gas bubbles through viscous non-Newtonian drilling fluid:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$$v_d = 1.53 \left[ \frac{\sigma \, g \, (\rho_l - \rho_g)}{\rho_l^2} \right]^{0.25}$$&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Core drift-flux gas velocity calculation from WellSim physics kernel
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_gas_slip_velocity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;rho_liquid_ppg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rho_gas_ppg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;v_mixture_fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;surface_tension_dyne_cm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;25.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;c0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Computes slip velocity of gas influx in drilling fluid using Zuber-Findlay drift-flux formulation.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Unit conversions to SI (kg/m^3, m/s)
&lt;/span&gt;    &lt;span class="n"&gt;rho_l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rho_liquid_ppg&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;119.826&lt;/span&gt;
    &lt;span class="n"&gt;rho_g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rho_gas_ppg&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;119.826&lt;/span&gt;
    &lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;surface_tension_dyne_cm&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1e-3&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;9.80665&lt;/span&gt;

    &lt;span class="c1"&gt;# Buoyancy drift component (Harmathy / Zuber-Findlay)
&lt;/span&gt;    &lt;span class="n"&gt;v_drift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.53&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;sigma&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho_l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;rho_g&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho_l&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;v_drift_fps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v_drift&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.28084&lt;/span&gt;

    &lt;span class="c1"&gt;# Combined slip velocity
&lt;/span&gt;    &lt;span class="n"&gt;v_gas_fps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v_mixture_fps&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v_drift_fps&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;v_gas_fps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Practical Takeaways for Well Engineers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never Choke on Gas Volume; Choke on Drillpipe Pressure:&lt;/strong&gt; While circulating gas to surface, casing pressure will wildly fluctuate as gas expands. &lt;strong&gt;Do not try to keep casing pressure steady.&lt;/strong&gt; Keep drillpipe circulating pressure locked on the kill schedule; let the casing choke fluctuate to accommodate gas expansion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the Shoe Window:&lt;/strong&gt; If your LOT (Leak-Off Test) margin is narrow ($&amp;lt; 0.5\text{ ppg}$ equivalent), calculating peak shoe pressure with non-ideal $Z$-factor dynamics is vital. If predicted shoe pressure exceeds fracture limit, the engineer must immediately select the Wait &amp;amp; Weight method or reduce pump rate to lower annular friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulate Before Circulating:&lt;/strong&gt; Real-time dynamic simulators like &lt;a href="https://wellsim.kcklayton.com" rel="noopener noreferrer"&gt;WellSim&lt;/a&gt; provide drillers and rig superintendents with second-by-second predictive pressure plots before initiating the pumps.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>wellcontrol</category>
      <category>multiphaseflow</category>
      <category>wellsim</category>
      <category>simulation</category>
    </item>
    <item>
      <title>Never Let an LLM Guess Wellbore Pressures: Deterministic Physics as MCP Tools</title>
      <dc:creator>Kirk Keel</dc:creator>
      <pubDate>Thu, 05 Nov 2026 04:36:18 +0000</pubDate>
      <link>https://dev.to/greybeard00007/never-let-an-llm-guess-wellbore-pressures-deterministic-physics-as-mcp-tools-gmc</link>
      <guid>https://dev.to/greybeard00007/never-let-an-llm-guess-wellbore-pressures-deterministic-physics-as-mcp-tools-gmc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published with interactive math formulas and diagrams at &lt;a href="https://eng.kcklayton.com/blog/deterministic-physics-as-mcp-tools/" rel="noopener noreferrer"&gt;eng.kcklayton.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Large Language Models (LLMs) are exceptional at synthesizing drilling logs, interpreting standard operating procedures (SOPs), and reasoning through complex operational triage.&lt;/p&gt;

&lt;p&gt;However, in safety-critical operations—where bottomhole circulating pressures exceed $10,000\text{ psi}$ and kicking gas migrates at hundreds of feet per hour—&lt;strong&gt;an LLM must never be permitted to generate pressure values or kill mud calculations via token prediction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Token generation is probabilistic. Well control physics must be deterministic.&lt;/p&gt;

&lt;p&gt;If an autonomous rig agent hallucinates an Initial Circulating Pressure by just $80\text{ psi}$, it can collapse the casing or fracture the formation, escalating an ordinary kick into a surface blowout.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Architectural Solution: Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;To harness the cognitive and reasoning capabilities of AI agents without risking physical hallucinations, we pair agentic reasoning frameworks with deterministic engineering engines via the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Rig Stream / WITSML] --&amp;gt; B[AI Agent / LLM]
    B --&amp;gt;|Structured JSON Query| C[wellcontrol MCP Server]
    C --&amp;gt;|Deterministic Physics Engine| C
    C --&amp;gt;|Verified Exact Math| B
    B --&amp;gt;|Verified Output| D[Driller Console / Choke Panel]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  How the Layered Responsibility Works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The LLM's Role (Reasoning &amp;amp; Orchestration):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Continuously monitors WITSML telemetry events (SPP spikes, pit gains, differential pressure changes).&lt;/li&gt;
&lt;li&gt;Identifies kick mechanisms, lost circulation anomalies, or drillstring pack-offs.&lt;/li&gt;
&lt;li&gt;Formulates the action plan in accordance with rig-specific SOPs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The MCP Tool's Role (Deterministic Math &amp;amp; Physics):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Computes exact hydrostatics, friction losses, multi-station torque and drag, and kill schedules.&lt;/li&gt;
&lt;li&gt;Operates with zero external network access and zero token randomness.&lt;/li&gt;
&lt;li&gt;Verified across hundreds of automated unit tests covering API RP 53, IADC, and IWCF benchmarks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Real-World Implementation: The &lt;code&gt;wellcontrol&lt;/code&gt; MCP Server
&lt;/h2&gt;

&lt;p&gt;Our &lt;a href="https://github.com/Greybeard00007/wellcontrol" rel="noopener noreferrer"&gt;&lt;code&gt;wellcontrol&lt;/code&gt;&lt;/a&gt; repository implements an production-grade MCP server exposing 5 core operational tools:&lt;/p&gt;

&lt;h3&gt;
  
  
  Exposed MCP Tools:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;evaluate_kill_methods&lt;/code&gt;&lt;/strong&gt;: Compares Wait &amp;amp; Weight, Driller's Method, Volumetric, and Bullheading against current hole volume, casing burst rating, and maximum surface pressure limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;plan_well_kill&lt;/code&gt;&lt;/strong&gt;: Generates step-by-step stroke schedules, initial and final circulating pressures, and casing shoe loading traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;plan_stripping_and_snubbing&lt;/code&gt;&lt;/strong&gt;: Computes pipe-light / pipe-heavy transition points, buoyant string weight, and annular choke bleeding schedules for tripping under pressure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;simulator_list_scenarios&lt;/code&gt;&lt;/strong&gt; &amp;amp; &lt;strong&gt;&lt;code&gt;simulator_create_or_step&lt;/code&gt;&lt;/strong&gt;: Connects directly to the transient 7-screen choke simulator for real-time training evaluation.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example MCP Tool Definition in wellcontrol
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plan_well_kill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;depth_tvd_ft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;current_mw_ppg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sidpp_psi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sicp_psi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;scrp_psi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;drillstring_vol_bbl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pump_output_bbl_stk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculates deterministic IADC WellSharp kill parameters.
    No LLM prediction: strictly verified deterministic formulas.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# 1. Kill Mud Weight with directional ceiling
&lt;/span&gt;    &lt;span class="n"&gt;raw_kmw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_mw_ppg&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sidpp_psi&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.052&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;depth_tvd_ft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kmw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;raw_kmw&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1e-9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. ICP &amp;amp; FCP
&lt;/span&gt;    &lt;span class="n"&gt;icp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sidpp_psi&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;scrp_psi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;scrp_psi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;kmw&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;current_mw_ppg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1e-9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Surface-to-bit displacement strokes
&lt;/span&gt;    &lt;span class="n"&gt;strokes_to_bit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drillstring_vol_bbl&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;pump_output_bbl_stk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kmw_ppg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kmw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;icp_psi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;icp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fcp_psi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fcp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strokes_to_bit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;strokes_to_bit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pressure_drop_per_100_stk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;icp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;fcp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;strokes_to_bit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1e-9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. CI/CD Governance &amp;amp; RAG Evaluation Gates
&lt;/h2&gt;

&lt;p&gt;Even when tools provide exact mathematical answers, agents must synthesize them into coherent action checklists for the toolpusher or driller.&lt;/p&gt;

&lt;p&gt;To prevent prompt drift or hallucinated section citations, we introduced &lt;strong&gt;&lt;code&gt;sop-rag-judge&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluates generated action plans against ground-truth SOP documents before outputs leave the edge server.&lt;/li&gt;
&lt;li&gt;Checks &lt;strong&gt;numeric drift&lt;/strong&gt;: If the agent's summary mentions a pressure differing by even $\pm 1\text{ psi}$ from the MCP tool output, the gate rejects the response.&lt;/li&gt;
&lt;li&gt;Runs automated hallucination and citation verifications across continuous integration test suites.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Combining generative reasoning with deterministic tool execution is the foundational requirement for AI in high-hazard environments. By using MCP as the abstraction boundary between language models and physical formulas, we achieve the best of both worlds: autonomous operational insight with deterministic physical safety.&lt;/p&gt;

&lt;p&gt;You can explore the live simulator at &lt;a href="https://wellcontrol.kcklayton.com" rel="noopener noreferrer"&gt;&lt;strong&gt;wellcontrol.kcklayton.com&lt;/strong&gt;&lt;/a&gt; or inspect the MCP implementation on GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/Greybeard00007/wellcontrol" rel="noopener noreferrer"&gt;&lt;strong&gt;github.com/Greybeard00007/wellcontrol&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>energyai</category>
      <category>mcpserver</category>
      <category>wellcontrol</category>
      <category>agenticai</category>
    </item>
  </channel>
</rss>
