<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>Managing database versions effectively is critical for maintaining stable, secure, and performant systems. Geode provides comprehensive version management capabilities including explicit version tracking, compatibility matrices, automated upgrade paths, and multi-version deployment support for enterprise environments.</p> <p>As an ISO/IEC 39075:2024 GQL-compliant graph database, Geode follows semantic versioning with clear compatibility guarantees, enabling predictable upgrade strategies and safe dependency management across complex deployment environments.</p> <h3 id="version-numbering-scheme" class="position-relative d-flex align-items-center group"> <span>Version Numbering Scheme</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="version-numbering-scheme" aria-haspopup="dialog" aria-label="Share link: Version Numbering Scheme"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p>Geode uses semantic versioning (SemVer 2.0.0):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Current Version: 0.2.18 </span></span><span class="line"><span class="cl">Next Minor: 0.3.0 </span></span><span class="line"><span class="cl">Next Major: 1.0.0 </span></span></code></pre></div><p><strong>Version Components Explained</strong>:</p> <p><strong>MAJOR Version</strong> (0.x.x → 1.x.x):</p> <ul> <li>Breaking API changes</li> <li>Protocol incompatibilities</li> <li>Database format changes requiring migration</li> <li>Removal of deprecated features</li> <li>Example: 0.2.15 → 1.0.0</li> </ul> <p><strong>MINOR Version</strong> (0.2.x → 0.3.x):</p> <ul> <li>New backward-compatible features</li> <li>New GQL functions or operators</li> <li>Performance improvements</li> <li>Enhanced client capabilities</li> <li>Example: 0.2.15 → 0.3.0</li> </ul> <p><strong>PATCH Version</strong> (0.2.14 → 0.2.15):</p> <ul> <li>Bug fixes</li> <li>Security patches</li> <li>Documentation corrections</li> <li>Minor optimizations</li> <li>Example: 0.2.14 → 0.2.15</li> </ul> <h3 id="current-version-geode_version" class="position-relative d-flex align-items-center group"> <span>Current Version: &lt;strong&gt;0.2.18&lt;/strong&gt;</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="current-version-geode_version" aria-haspopup="dialog" aria-label="Share link: Current Version: GEODE_"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Server Version</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ geode version </span></span><span class="line"><span class="cl">Geode v0.2.18 </span></span><span class="line"><span class="cl">Build: 20260329-&lt;release-sha&gt; </span></span><span class="line"><span class="cl">Zig: 0.1.0 </span></span><span class="line"><span class="cl">Protocol: QUIC v1 </span></span><span class="line"><span class="cl">GQL: ISO/IEC 39075:2024 </span></span></code></pre></div><p><strong>Client Library Versions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Go</span> </span></span><span class="line"><span class="cl">geodedb.com/geode v0.2.18 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Python</span> </span></span><span class="line"><span class="cl">geode-client<span class="o">==</span>0.3.19 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Rust</span> </span></span><span class="line"><span class="cl">geode-client <span class="o">=</span> <span class="s2">&#34;0.1.1-alpha.8&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Zig</span> </span></span><span class="line"><span class="cl">geode-client v0.1.0 </span></span></code></pre></div> <h3 id="version-compatibility-matrix" class="position-relative d-flex align-items-center group"> <span>Version Compatibility Matrix</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="version-compatibility-matrix" aria-haspopup="dialog" aria-label="Share link: Version Compatibility Matrix"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="server-client-compatibility" class="position-relative d-flex align-items-center group"> <span>Server-Client Compatibility</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="server-client-compatibility" aria-haspopup="dialog" aria-label="Share link: Server-Client Compatibility"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Server Version</th> <th>Go Client</th> <th>Python Client</th> <th>Rust Client</th> <th>Zig Client</th> <th>Protocol</th> </tr> </thead> <tbody> <tr> <td>0.2.x</td> <td>rolling</td> <td>0.3.19+</td> <td>0.1.1-alpha.8+</td> <td>0.1.0+</td> <td>QUIC v1</td> </tr> <tr> <td>0.1.28-0.1.39</td> <td>rolling</td> <td>0.3.19+</td> <td>0.1.1-alpha.8+</td> <td>0.1.0+</td> <td>QUIC v1</td> </tr> <tr> <td>0.1.3-0.1.27</td> <td>validate in staging</td> <td>0.3.x</td> <td>0.1.x</td> <td>0.1.x</td> <td>QUIC v1</td> </tr> </tbody> </table> <p><strong>Compatibility Rules</strong>:</p> <ul> <li><strong>Prefer Current Stable Line</strong>: Match the current stable server line with the latest published client for that language</li> <li><strong>Patch Flexibility</strong>: Any patch version within the same minor version is compatible</li> <li><strong>Major Boundaries</strong>: Crossing major versions requires explicit migration</li> <li><strong>Forward Compatibility</strong>: Clients may connect to newer server patch versions</li> <li><strong>Backward Compatibility</strong>: Servers support clients from the same minor version</li> </ul> <h4 id="protocol-version-compatibility" class="position-relative d-flex align-items-center group"> <span>Protocol Version Compatibility</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="protocol-version-compatibility" aria-haspopup="dialog" aria-label="Share link: Protocol Version Compatibility"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Version</th> <th>Protocol</th> <th>Transport Notes</th> <th>TLS</th> <th>Port</th> <th>Status</th> </tr> </thead> <tbody> <tr> <td>0.2.x</td> <td>QUIC v1</td> <td>Multiplexed streams</td> <td>TLS 1.3</td> <td>3141</td> <td>Current</td> </tr> <tr> <td>0.1.28-0.1.39</td> <td>QUIC v1</td> <td>March 2026 storage transition line</td> <td>TLS 1.3</td> <td>3141</td> <td>Upgrade planned</td> </tr> <tr> <td>0.1.3-0.1.27</td> <td>QUIC v1</td> <td>Early production-ready line</td> <td>TLS 1.3</td> <td>3141</td> <td>Legacy</td> </tr> </tbody> </table> <p><strong>Migration Path</strong>: Early <code>v0.1.x</code> stable line → March 2026 storage transition line → current <code>v0.2.x</code> stable line</p> <h3 id="checking-versions" class="position-relative d-flex align-items-center group"> <span>Checking Versions</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="checking-versions" aria-haspopup="dialog" aria-label="Share link: Checking Versions"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Server Version Check</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Version command</span> </span></span><span class="line"><span class="cl">geode version </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Detailed version information</span> </span></span><span class="line"><span class="cl">geode version --verbose </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># JSON output for parsing</span> </span></span><span class="line"><span class="cl">geode version --json </span></span></code></pre></div><p><strong>Client Version Check</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Go</span> </span></span><span class="line"><span class="cl">go list -m geodedb.com/geode </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Python</span> </span></span><span class="line"><span class="cl">pip show geode-client </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Rust</span> </span></span><span class="line"><span class="cl">cargo tree <span class="p">|</span> grep geode-client </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Zig</span> </span></span><span class="line"><span class="cl">zig build --version </span></span></code></pre></div><p><strong>Runtime Version Negotiation</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">server</span><span class="w"> </span><span class="py">version</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">client</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">VERSION</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">version</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;0.2.18&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">build</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;20240124-1a2b3c4&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">protocol</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;QUIC v1&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">gql_version</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;ISO/IEC 39075:2024&#34;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="version-pinning" class="position-relative d-flex align-items-center group"> <span>Version Pinning</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="version-pinning" aria-haspopup="dialog" aria-label="Share link: Version Pinning"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Package Manager Pinning</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Go - go.mod</span> </span></span><span class="line"><span class="cl">module myapp </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">go 1.24 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">require <span class="o">(</span> </span></span><span class="line"><span class="cl"> geodedb.com/geode v0.2.18 // Exact version </span></span><span class="line"><span class="cl"><span class="o">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Python - requirements.txt</span> </span></span><span class="line"><span class="cl">geode-client<span class="o">==</span>0.3.19 <span class="c1"># Exact version</span> </span></span><span class="line"><span class="cl">geode-client&gt;<span class="o">=</span>0.3.19,&lt;0.4.0 <span class="c1"># Version range</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Rust - Cargo.toml</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>dependencies<span class="o">]</span> </span></span><span class="line"><span class="cl">geode-client <span class="o">=</span> <span class="s2">&#34;=0.1.1-alpha.8&#34;</span> <span class="c1"># Exact version</span> </span></span><span class="line"><span class="cl"><span class="c1"># OR</span> </span></span><span class="line"><span class="cl">geode-client <span class="o">=</span> <span class="s2">&#34;~0.1&#34;</span> <span class="c1"># Same minor version</span> </span></span><span class="line"><span class="cl"><span class="c1"># OR</span> </span></span><span class="line"><span class="cl">geode-client <span class="o">=</span> <span class="s2">&#34;^0.1&#34;</span> <span class="c1"># Compatible versions</span> </span></span></code></pre></div><p><strong>Container Version Pinning</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="c"># Exact version</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> geodedb/geode:0.2.18</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Minor version (latest patch)</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> geodedb/geode:0.2</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Major version (latest minor)</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> geodedb/geode:0</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="c"># Latest (not recommended for production)</span><span class="err"> </span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="k">FROM</span><span class="s"> geodedb/geode:latest</span><span class="err"> </span></span></span></code></pre></div><p><strong>Configuration Version Lock</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># config.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">server</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version_check</span><span class="p">:</span><span class="w"> </span><span class="l">strict </span><span class="w"> </span><span class="c"># Enforce exact version match</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min_client_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.0.0&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_client_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.0.99&#34;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="upgrade-strategies" class="position-relative d-flex align-items-center group"> <span>Upgrade Strategies</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="upgrade-strategies" aria-haspopup="dialog" aria-label="Share link: Upgrade Strategies"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="rolling-upgrades-zero-downtime" class="position-relative d-flex align-items-center group"> <span>Rolling Upgrades (Zero-Downtime)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="rolling-upgrades-zero-downtime" aria-haspopup="dialog" aria-label="Share link: Rolling Upgrades (Zero-Downtime)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>For clustered deployments:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Upgrade standby nodes first</span> </span></span><span class="line"><span class="cl">ssh replica-1 <span class="s2">&#34;sudo apt-get install geode=0.2.18&#34;</span> </span></span><span class="line"><span class="cl">ssh replica-2 <span class="s2">&#34;sudo apt-get install geode=0.2.18&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Wait for replication sync</span> </span></span><span class="line"><span class="cl">geode cluster status </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Promote replica to primary</span> </span></span><span class="line"><span class="cl">geode cluster promote replica-1 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 4. Upgrade old primary</span> </span></span><span class="line"><span class="cl">ssh primary <span class="s2">&#34;sudo apt-get install geode=0.2.18&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 5. Rebalance cluster</span> </span></span><span class="line"><span class="cl">geode cluster rebalance </span></span></code></pre></div> <h4 id="blue-green-deployment" class="position-relative d-flex align-items-center group"> <span>Blue-Green Deployment</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="blue-green-deployment" aria-haspopup="dialog" aria-label="Share link: Blue-Green Deployment"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Deploy new version to green environment</span> </span></span><span class="line"><span class="cl">docker-compose -f docker-compose.green.yml up -d </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Replicate data from blue to green</span> </span></span><span class="line"><span class="cl">geode replicate --from blue:3141 --to green:3141 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Test green environment</span> </span></span><span class="line"><span class="cl">./run-integration-tests.sh --host green:3141 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 4. Switch traffic to green</span> </span></span><span class="line"><span class="cl">kubectl patch service geode -p <span class="s1">&#39;{&#34;spec&#34;:{&#34;selector&#34;:{&#34;version&#34;:&#34;0.2.18&#34;}}}&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 5. Decommission blue environment after validation</span> </span></span><span class="line"><span class="cl">docker-compose -f docker-compose.blue.yml down </span></span></code></pre></div> <h4 id="canary-deployment" class="position-relative d-flex align-items-center group"> <span>Canary Deployment</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="canary-deployment" aria-haspopup="dialog" aria-label="Share link: Canary Deployment"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Route 10% of traffic to new version</span> </span></span><span class="line"><span class="cl">kubectl apply -f canary-10percent.yaml </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Monitor metrics and errors</span> </span></span><span class="line"><span class="cl">kubectl logs -l <span class="nv">version</span><span class="o">=</span>0.2.18 --tail<span class="o">=</span><span class="m">100</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Gradually increase traffic: 25% → 50% → 100%</span> </span></span><span class="line"><span class="cl">kubectl apply -f canary-25percent.yaml </span></span><span class="line"><span class="cl">kubectl apply -f canary-50percent.yaml </span></span><span class="line"><span class="cl">kubectl apply -f canary-100percent.yaml </span></span></code></pre></div> <h3 id="multi-version-support" class="position-relative d-flex align-items-center group"> <span>Multi-Version Support</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="multi-version-support" aria-haspopup="dialog" aria-label="Share link: Multi-Version Support"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Running Multiple Versions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Different versions on different ports</span> </span></span><span class="line"><span class="cl">/opt/geode-0.1.2/bin/geode serve --listen :8443 </span></span><span class="line"><span class="cl">/opt/geode-0.2.18/bin/geode serve --listen :3141 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Docker containers</span> </span></span><span class="line"><span class="cl">docker run -p 8443:8443 geodedb/geode:0.1.2 </span></span><span class="line"><span class="cl">docker run -p 3141:3141 geodedb/geode:0.2.18 </span></span></code></pre></div><p><strong>Client Version Selection</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go - include client version in HELLO </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">sql</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">&#34;geode&#34;</span><span class="p">,</span> <span class="s">&#34;localhost:3141?hello_ver=0.2.18&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">// Python - include client version in HELLO </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">client</span> <span class="p">=</span> <span class="nf">Client</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="nx">host</span><span class="p">=</span><span class="s">&#34;localhost&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">port</span><span class="p">=</span><span class="mi">3141</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">hello_ver</span><span class="p">=</span><span class="s">&#34;0.2.18&#34;</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">// Rust - include client version in HELLO </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">let</span> <span class="nx">client</span> <span class="p">=</span> <span class="nx">Client</span><span class="p">::</span><span class="nb">new</span><span class="p">(</span><span class="s">&#34;localhost&#34;</span><span class="p">,</span> <span class="mi">3141</span><span class="p">).</span><span class="nf">hello_ver</span><span class="p">(</span><span class="s">&#34;0.2.18&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="nx">let</span> <span class="nx">mut</span> <span class="nx">conn</span> <span class="p">=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">connect</span><span class="p">().</span><span class="nx">await</span><span class="err">?</span><span class="p">;</span> </span></span></code></pre></div> <h3 id="version-metadata" class="position-relative d-flex align-items-center group"> <span>Version Metadata</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="version-metadata" aria-haspopup="dialog" aria-label="Share link: Version Metadata"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Query Runtime Version Information</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Server</span><span class="w"> </span><span class="py">version</span><span class="w"> </span><span class="py">details</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">VERSION</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Protocol</span><span class="w"> </span><span class="py">capabilities</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">PROTOCOL</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Feature</span><span class="w"> </span><span class="py">support</span><span class="w"> </span><span class="py">matrix</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">FEATURES</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Client</span><span class="w"> </span><span class="py">library</span><span class="w"> </span><span class="py">version</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">CLIENT_VERSION</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Programmatic Version Access</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">version</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">ServerVersion</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Server: %s\n&#34;</span><span class="p">,</span> <span class="nx">version</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Client: %s\n&#34;</span><span class="p">,</span> <span class="nx">geode</span><span class="p">.</span><span class="nx">ClientVersion</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">// Python </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">version</span> <span class="p">=</span> <span class="nx">await</span> <span class="nx">client</span><span class="p">.</span><span class="nf">get_server_version</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nx">f</span><span class="s">&#34;Server: {version}&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nx">f</span><span class="s">&#34;Client: {geode_client.__version__}&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">// Rust </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nx">let</span> <span class="nx">version</span> <span class="p">=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">server_version</span><span class="p">().</span><span class="nx">await</span><span class="err">?</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="nx">println</span><span class="p">!(</span><span class="s">&#34;Server: {}&#34;</span><span class="p">,</span> <span class="nx">version</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="nx">println</span><span class="p">!(</span><span class="s">&#34;Client: {}&#34;</span><span class="p">,</span> <span class="nx">geode_client</span><span class="p">::</span><span class="nx">VERSION</span><span class="p">);</span> </span></span></code></pre></div> <h3 id="dependency-management" class="position-relative d-flex align-items-center group"> <span>Dependency Management</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="dependency-management" aria-haspopup="dialog" aria-label="Share link: Dependency Management"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Transitive Dependencies</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Go - view dependency tree</span> </span></span><span class="line"><span class="cl">go mod graph <span class="p">|</span> grep geode </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Python - view dependencies</span> </span></span><span class="line"><span class="cl">pip show geode-client </span></span><span class="line"><span class="cl">pipdeptree -p geode-client </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Rust - dependency tree</span> </span></span><span class="line"><span class="cl">cargo tree -p geode-client </span></span></code></pre></div><p><strong>Lock Files</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Go - go.sum</span> </span></span><span class="line"><span class="cl">geodedb.com/geode v0.2.18 h1:abc123... </span></span><span class="line"><span class="cl">geodedb.com/geode v0.2.18/go.mod h1:def456... </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Python - poetry.lock or Pipfile.lock</span> </span></span><span class="line"><span class="cl"><span class="o">[[</span>package<span class="o">]]</span> </span></span><span class="line"><span class="cl"><span class="nv">name</span> <span class="o">=</span> <span class="s2">&#34;geode-client&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">version</span> <span class="o">=</span> <span class="s2">&#34;0.3.19&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Rust - Cargo.lock</span> </span></span><span class="line"><span class="cl"><span class="o">[[</span>package<span class="o">]]</span> </span></span><span class="line"><span class="cl"><span class="nv">name</span> <span class="o">=</span> <span class="s2">&#34;geode-client&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">version</span> <span class="o">=</span> <span class="s2">&#34;0.1.1-alpha.8&#34;</span> </span></span></code></pre></div> <h3 id="version-constraints-in-cicd" class="position-relative d-flex align-items-center group"> <span>Version Constraints in CI/CD</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="version-constraints-in-cicd" aria-haspopup="dialog" aria-label="Share link: Version Constraints in CI/CD"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>GitHub Actions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Test</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">on</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">push, pull_request]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">jobs</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">services</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:0.2.18 </span><span class="w"> </span><span class="c"># Pin exact version</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="m">3141</span><span class="p">:</span><span class="m">3141</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">steps</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">actions/checkout@v3</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Install Client</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">pip install geode-client==0.3.19 </span><span class="w"> </span><span class="c"># Pin exact version</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Run Tests</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">pytest tests/</span><span class="w"> </span></span></span></code></pre></div><p><strong>GitLab CI</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">test</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">python:3.11</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">services</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:0.2.18</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">before_script</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pip install geode-client==0.3.19</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">script</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pytest tests/</span><span class="w"> </span></span></span></code></pre></div> <h3 id="breaking-change-migration" class="position-relative d-flex align-items-center group"> <span>Breaking Change Migration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="breaking-change-migration" aria-haspopup="dialog" aria-label="Share link: Breaking Change Migration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>When crossing major version boundaries:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Review breaking changes</span> </span></span><span class="line"><span class="cl">geode changelog --breaking --since v0.2.18 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Run migration checker</span> </span></span><span class="line"><span class="cl">geode migrate check --from 0.2.18 --to 1.0.0 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Generate migration plan</span> </span></span><span class="line"><span class="cl">geode migrate plan --from 0.2.18 --to 1.0.0 --output plan.yaml </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 4. Execute migration</span> </span></span><span class="line"><span class="cl">geode migrate execute --plan plan.yaml </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 5. Validate migration</span> </span></span><span class="line"><span class="cl">geode migrate validate </span></span></code></pre></div> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ol> <li><strong>Pin Production Versions</strong>: Always use exact version constraints in production</li> <li><strong>Test Upgrades</strong>: Validate new versions in staging before production</li> <li><strong>Monitor Version Skew</strong>: Ensure client and server versions remain compatible</li> <li><strong>Document Dependencies</strong>: Maintain clear documentation of version requirements</li> <li><strong>Automate Checks</strong>: Use CI/CD to enforce version compatibility</li> <li><strong>Plan Migrations</strong>: Schedule maintenance windows for major version upgrades</li> <li><strong>Keep Current</strong>: Stay within supported version ranges (latest 2 minor versions)</li> </ol> <h3 id="troubleshooting-version-issues" class="position-relative d-flex align-items-center group"> <span>Troubleshooting Version Issues</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="troubleshooting-version-issues" aria-haspopup="dialog" aria-label="Share link: Troubleshooting Version Issues"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Version Mismatch Errors</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Error: Client version 0.2.0 incompatible with server 0.2.18 </span></span><span class="line"><span class="cl">Solution: Upgrade client to the current published line for your language </span></span></code></pre></div><p><strong>Protocol Incompatibility</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Error: Protocol QUIC v1 required, but client uses TCP </span></span><span class="line"><span class="cl">Solution: Upgrade to client library version 1.0.0+ </span></span></code></pre></div><p><strong>Feature Not Available</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Error: CTE support not available in server version 0.2.13 </span></span><span class="line"><span class="cl">Solution: Upgrade server to 0.2.18+ </span></span></code></pre></div> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Release Notes and Versioning</li> <li>Version Changelog</li> <li>Migration Guides</li> <li>Compatibility Matrix</li> <li>Dependency Management</li> <li>Upgrade Procedures</li> <li>Standards Compliance</li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Semantic Versioning Specification</li> <li>Version Compatibility Testing</li> <li>Database Migration Strategies</li> <li>Dependency Management Best Practices</li> <li>CI/CD Version Pinning</li> <li>Multi-Version Deployment</li> <li>Upgrade Planning Guide</li> </ul>

Related Articles