<?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: Moshe Avdiel</title>
    <description>The latest articles on DEV Community by Moshe Avdiel (@kiponos).</description>
    <link>https://dev.to/kiponos</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%2F2975663%2F7c703462-585e-4d82-9a48-de31931d0415.png</url>
      <title>DEV Community: Moshe Avdiel</title>
      <link>https://dev.to/kiponos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiponos"/>
    <language>en</language>
    <item>
      <title>When Not to Use Live Config — Honest Boundaries (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Mon, 13 Jul 2026 04:30:59 +0000</pubDate>
      <link>https://dev.to/kiponos/when-not-to-use-live-config-honest-boundaries-architecture-5e61</link>
      <guid>https://dev.to/kiponos/when-not-to-use-live-config-honest-boundaries-architecture-5e61</guid>
      <description>&lt;p&gt;Vendor RFP. The prospect asks: &lt;em&gt;"Can Kiponos replace our secrets manager, GitOps pipeline, and experimentation platform?"&lt;/em&gt; Sales wants to say yes. The principal architect pulls up this doc:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Kiponos is a &lt;strong&gt;live operational config hub&lt;/strong&gt; — not everything that changes in production. State the &lt;strong&gt;anti-cases&lt;/strong&gt; explicitly or we recreate sprawl in reverse."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Honest boundaries build trust. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; owns &lt;strong&gt;operational knobs&lt;/strong&gt; with local Java and Python &lt;code&gt;get*()&lt;/code&gt; on hot paths. It does &lt;strong&gt;not&lt;/strong&gt; own secrets, infrastructure desired state, cohort experiments, or immutable compliance records. Use this pattern during &lt;strong&gt;vendor RFP — state what Kiponos does not do&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — hub scope creep
&lt;/h2&gt;

&lt;p&gt;Teams migrate everything to the hub because the dashboard is convenient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Anti-pattern — wrong classes in Kiponos tree&lt;/span&gt;
&lt;span class="s"&gt;payments_live/&lt;/span&gt;
  &lt;span class="s"&gt;db_password&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;..."&lt;/span&gt;              &lt;span class="c1"&gt;# secret — WRONG&lt;/span&gt;
  &lt;span class="na"&gt;replica_count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;               &lt;span class="c1"&gt;# gitops — WRONG&lt;/span&gt;
  &lt;span class="na"&gt;new_checkout_for_5pct_eu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="c1"&gt;# experiment — WRONG&lt;/span&gt;
  &lt;span class="na"&gt;block_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;                 &lt;span class="c1"&gt;# ops — CORRECT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scope creep &lt;strong&gt;couples&lt;/strong&gt; secret rotation outages to fraud tuning and erodes security review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"One dashboard to rule them all"&lt;/td&gt;
&lt;td&gt;Mixed classes &lt;strong&gt;break audit&lt;/strong&gt; boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Live config is always faster"&lt;/td&gt;
&lt;td&gt;GitOps &lt;strong&gt;correct&lt;/strong&gt; for infra topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We can put secrets in hub with ACL"&lt;/td&gt;
&lt;td&gt;Not a secrets manager — no rotation HSM model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Flags and ops are the same"&lt;/td&gt;
&lt;td&gt;Cohort targeting ≠ circuit thresholds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"If it changes in prod, use Kiponos"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Change trigger&lt;/strong&gt; and &lt;strong&gt;read pattern&lt;/strong&gt; decide&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live config is for operational behavior on hot paths — not for every mutable value in production.&lt;/strong&gt; Saying no to anti-cases is as important as saying yes to &lt;code&gt;block_score&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary matrix — what Kiponos does NOT do
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Anti-case&lt;/th&gt;
&lt;th&gt;Why not Kiponos&lt;/th&gt;
&lt;th&gt;Use instead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No envelope encryption rotation model&lt;/td&gt;
&lt;td&gt;Vault, Secrets Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infra desired state&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replicas, CRDs, IAM, LB ARNs&lt;/td&gt;
&lt;td&gt;GitOps, Terraform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cohort experiments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User targeting + exposure analytics&lt;/td&gt;
&lt;td&gt;Statsig, LaunchDarkly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Immutable audit records&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hub is mutable by design&lt;/td&gt;
&lt;td&gt;WORM store, SIEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legal policy documents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not a compliance workflow&lt;/td&gt;
&lt;td&gt;Wiki + GRC tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bootstrap wiring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rarely changed; Git review valuable&lt;/td&gt;
&lt;td&gt;Helm, YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Non Java/Python hot paths&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SDK scope today&lt;/td&gt;
&lt;td&gt;Java/Python service boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CDN/WAF vendor rule packs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vendor-owned signatures&lt;/td&gt;
&lt;td&gt;Cloudflare, AWS WAF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Architecture — hub in context
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4a0de7zbk3c3iseovsnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4a0de7zbk3c3iseovsnh.png" alt="Architecture diagram" width="798" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree — boundaries documented in profile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;boundaries/&lt;/span&gt;
  &lt;span class="s"&gt;hub_owns&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;fraud thresholds&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;circuit breaker floats&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;rate limits and tenant quotas&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;saga timeouts&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ml batch and pool sizes&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;peak posture knobs&lt;/span&gt;
  &lt;span class="na"&gt;hub_does_not_own&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db passwords and API keys&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;replica counts and CRDs&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;cohort experiment gates&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PCI KEK material&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TLS private keys&lt;/span&gt;
  &lt;span class="na"&gt;rfp_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026.1"&lt;/span&gt;
&lt;span class="s"&gt;fraud/&lt;/span&gt;
  &lt;span class="s"&gt;thresholds/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
&lt;span class="s"&gt;resilience/&lt;/span&gt;
  &lt;span class="s"&gt;payments/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['platform']['prod']['boundaries']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — enforce boundaries in code (Java)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BoundaryAwarePayments&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${spring.datasource.password}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;dbPassword&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Vault — NOT kiponos&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;BoundaryAwarePayments&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                 &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${spring.datasource.password}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;dbPassword&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbPassword&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// YES — operational hot path&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="nf"&gt;dbConnection&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// NO — secret from Vault-injected env, never kiponos.path("db_password")&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbPassword&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;boundaries&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# YES
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;block_score&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fraud&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;thresholds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# NO — use os.environ from Vault at worker start
&lt;/span&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DATABASE_URL&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;
  
  
  Anti-case decision table — RFP copy-paste
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prospect question&lt;/th&gt;
&lt;th&gt;Honest answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replace Vault?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; — secrets stay in Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace Argo CD?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; — infra desired state stays GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace LaunchDarkly?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; for cohort experiments; optional bools only if consolidating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace Consul service discovery?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; — keep Consul for SD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tune fraud thresholds live?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share saga timeouts Java + Python?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Store PCI PAN?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; — never&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js SDK?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Not supported&lt;/strong&gt; — Java/Python only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Scope creep mistake&lt;/th&gt;
&lt;th&gt;Honest boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vendor RFP&lt;/td&gt;
&lt;td&gt;"Unified platform" overclaim&lt;/td&gt;
&lt;td&gt;Boundary matrix in response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM migrates experiment to hub&lt;/td&gt;
&lt;td&gt;Wrong analytics&lt;/td&gt;
&lt;td&gt;Redirect to Statsig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRE puts replica count in hub&lt;/td&gt;
&lt;td&gt;Couples to fraud edits&lt;/td&gt;
&lt;td&gt;GitOps PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security audit&lt;/td&gt;
&lt;td&gt;Password in tree&lt;/td&gt;
&lt;td&gt;Block merge; Vault only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML Node service&lt;/td&gt;
&lt;td&gt;Demands Kiponos&lt;/td&gt;
&lt;td&gt;Java/Python boundary doc&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance — why boundaries matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secrets in hub&lt;/strong&gt; — wrong security model; if attempted, per-read encryption unusable at 11k TPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infra keys in hub&lt;/strong&gt; — bypasses Git audit trail for cluster topology&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiments in hub&lt;/strong&gt; — missing exposure events; wrong evaluation semantics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ops keys in Git&lt;/strong&gt; — PR latency on incidents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean boundary&lt;/strong&gt; — each tool optimized for its read/write pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Wrong tool&lt;/th&gt;
&lt;th&gt;Right tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Credential rotation&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5% EU canary&lt;/td&gt;
&lt;td&gt;Kiponos alone&lt;/td&gt;
&lt;td&gt;LaunchDarkly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;block_score&lt;/code&gt; incident&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatefulSet image&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immutable SOC2 export&lt;/td&gt;
&lt;td&gt;Kiponos history&lt;/td&gt;
&lt;td&gt;WORM archive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When TO use Kiponos (contrast)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Use Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read per request on Java/Python path&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change during incident in seconds&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested fraud/resilience/limits tree&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-runtime shared ops values&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes) — publish boundaries
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;['platform']['prod']['boundaries']&lt;/code&gt; with &lt;code&gt;hub_owns&lt;/code&gt; / &lt;code&gt;hub_does_not_own&lt;/code&gt; lists.&lt;/li&gt;
&lt;li&gt;Grep hub for &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;api_key&lt;/code&gt;, &lt;code&gt;replica&lt;/code&gt; — migrate out.&lt;/li&gt;
&lt;li&gt;Add RFP appendix linking this pattern.&lt;/li&gt;
&lt;li&gt;PR template: &lt;em&gt;"Confirm key not in anti-case list."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Wire &lt;code&gt;authorize()&lt;/code&gt; to &lt;code&gt;fraud/thresholds&lt;/code&gt; only — secrets from &lt;code&gt;@Value&lt;/code&gt; Vault injection.&lt;/li&gt;
&lt;li&gt;Share &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-hot-path-config-checklist.md" rel="noopener noreferrer"&gt;hot-path checklist&lt;/a&gt; with prospects.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-when-vault-when-kiponos.md" rel="noopener noreferrer"&gt;When Vault, when Kiponos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-ops-knob-taxonomy.md" rel="noopener noreferrer"&gt;Ops knob taxonomy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — honest boundaries close RFPs faster than overclaiming a hub that was never meant to hold your DB password.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Nested Ops Tree Conventions — Folder Layout That Scales (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:13:40 +0000</pubDate>
      <link>https://dev.to/kiponos/nested-ops-tree-conventions-folder-layout-that-scales-architecture-3i23</link>
      <guid>https://dev.to/kiponos/nested-ops-tree-conventions-folder-layout-that-scales-architecture-3i23</guid>
      <description>&lt;p&gt;New team onboarding. Payments has &lt;code&gt;fraud/block_score&lt;/code&gt; in Kiponos. Catalog invented &lt;code&gt;limits/catalog_rpm&lt;/code&gt;. ML put &lt;code&gt;batchSize&lt;/code&gt; at the profile root. Platform cannot grep one incident subtree across services.&lt;/p&gt;

&lt;p&gt;The platform engineering RFC meeting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We need &lt;strong&gt;folder conventions&lt;/strong&gt; — fraud, resilience, limits, saga, ml — so every team nests ops keys the same way. &lt;code&gt;max_depth&lt;/code&gt; and naming rules are not bureaucracy; they are &lt;strong&gt;on-call ergonomics&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This pattern defines &lt;strong&gt;nested ops tree layout&lt;/strong&gt; for &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; profiles. Adopt during &lt;strong&gt;new team onboard — adopt tree layout RFC&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — flat and divergent trees
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Inconsistent paths across services&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// catalog — wrong&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// payments — better&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FraudThresholds"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BlockScore"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ML — chaos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consul-era flat keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/payments/prod/fraud/block_score
config/catalog/prod/catalog_rpm_limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without conventions, &lt;strong&gt;cross-service incidents&lt;/strong&gt; require archaeology.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Teams self-organize folders"&lt;/td&gt;
&lt;td&gt;Six teams → six hierarchies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Flat keys are grep-friendly"&lt;/td&gt;
&lt;td&gt;Flat keys &lt;strong&gt;collide&lt;/strong&gt; at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Naming is internal docs"&lt;/td&gt;
&lt;td&gt;On-call uses &lt;strong&gt;dashboard tree&lt;/strong&gt; under stress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Depth does not matter"&lt;/td&gt;
&lt;td&gt;Deep chaos vs &lt;strong&gt;shallow standard&lt;/strong&gt; differs at 3 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Conventions slow delivery"&lt;/td&gt;
&lt;td&gt;Divergence slows &lt;strong&gt;every&lt;/strong&gt; shared incident&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Folder layout is an operational API.&lt;/strong&gt; Standard top-level domains — &lt;code&gt;fraud&lt;/code&gt;, &lt;code&gt;resilience&lt;/code&gt;, &lt;code&gt;limits&lt;/code&gt;, &lt;code&gt;saga&lt;/code&gt;, &lt;code&gt;ml&lt;/code&gt;, &lt;code&gt;peak&lt;/code&gt; — let any engineer navigate any service profile without a wiki. Conventions beat cleverness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convention — top-level domains
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Folder&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;th&gt;Example keys&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraud/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scores, velocity, BIN attack&lt;/td&gt;
&lt;td&gt;&lt;code&gt;thresholds/block_score&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resilience/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Circuit breakers, retries, bulkheads&lt;/td&gt;
&lt;td&gt;&lt;code&gt;payments/failure_rate_threshold&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limits/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rate limits, tenant quotas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tenant_acme/rpm&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saga/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compensation timeouts, signals&lt;/td&gt;
&lt;td&gt;&lt;code&gt;inventory_compensation/timeout_ms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ml/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Batch size, pool, routing&lt;/td&gt;
&lt;td&gt;&lt;code&gt;embedding/worker_pool_size&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;peak/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Posture mode, peak overrides&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mode_enabled&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audit/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flip metadata, last editor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;last_change_by&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Max depth:&lt;/strong&gt; 4 levels from profile root (e.g. &lt;code&gt;fraud/thresholds/block_score&lt;/code&gt;). Deeper → refactor subdomain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key naming:&lt;/strong&gt; &lt;code&gt;snake_case&lt;/code&gt; only. No camelCase in tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8yx39sauejo0x1nr2y4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8yx39sauejo0x1nr2y4.png" alt="Architecture diagram" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference tree — payments service layout
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;fraud/&lt;/span&gt;
  &lt;span class="s"&gt;thresholds/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
    &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;67&lt;/span&gt;
    &lt;span class="na"&gt;velocity_per_hour&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="s"&gt;resilience/&lt;/span&gt;
  &lt;span class="s"&gt;payments/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;
    &lt;span class="na"&gt;wait_duration_open_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25000&lt;/span&gt;
    &lt;span class="na"&gt;max_retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;inventory/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;
&lt;span class="s"&gt;limits/&lt;/span&gt;
  &lt;span class="s"&gt;global/&lt;/span&gt;
    &lt;span class="s"&gt;rpm&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
  &lt;span class="s"&gt;tenant_acme/&lt;/span&gt;
    &lt;span class="s"&gt;rpm&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6000&lt;/span&gt;
    &lt;span class="na"&gt;burst&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;900&lt;/span&gt;
&lt;span class="s"&gt;saga/&lt;/span&gt;
  &lt;span class="s"&gt;inventory_compensation/&lt;/span&gt;
    &lt;span class="s"&gt;timeout_ms&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45000&lt;/span&gt;
    &lt;span class="na"&gt;max_retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;shipping_handoff/&lt;/span&gt;
    &lt;span class="s"&gt;timeout_ms&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30000&lt;/span&gt;
    &lt;span class="na"&gt;signal_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ready_for_pickup&lt;/span&gt;
&lt;span class="s"&gt;ml/&lt;/span&gt;
  &lt;span class="s"&gt;routing/&lt;/span&gt;
    &lt;span class="s"&gt;primary_model&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v3&lt;/span&gt;
    &lt;span class="s"&gt;fallback_model&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2&lt;/span&gt;
    &lt;span class="s"&gt;batch_size&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
&lt;span class="s"&gt;conventions/&lt;/span&gt;
  &lt;span class="s"&gt;layout_version&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026.1"&lt;/span&gt;
  &lt;span class="na"&gt;max_depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
  &lt;span class="na"&gt;owner_team&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-engineering&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['conventions']['prod']['layout']&lt;/code&gt; — or per service &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — path helper enforces conventions (Java)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OpsTreePaths&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MAX_DEPTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;fraudBlockScore&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;paymentsCircuitThreshold&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"resilience"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payments"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getFloat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"failure_rate_threshold"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;tenantRpm&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tenantSlug&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;validateDepth&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"limits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenantSlug&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"rpm"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"limits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenantSlug&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rpm"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;validateDepth&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MAX_DEPTH&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"Path exceeds max_depth "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;MAX_DEPTH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;": "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python — same conventions
&lt;/h3&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;saga_inventory_timeout_ms&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;saga&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;inventory_compensation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeout_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Layout RFC checklist — new team onboard
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Copy reference tree skeleton&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Map service-specific upstreams under &lt;code&gt;resilience/{upstream}/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Place tenant limits under &lt;code&gt;limits/tenant_{slug}/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;conventions/layout_version&lt;/code&gt; key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Code review rejects root-level ops floats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Dashboard ACL by folder (fraud team → &lt;code&gt;fraud/*&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Ad-hoc layout&lt;/th&gt;
&lt;th&gt;Conventions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-service incident&lt;/td&gt;
&lt;td&gt;Six grep patterns&lt;/td&gt;
&lt;td&gt;&lt;code&gt;resilience/*/failure_rate_threshold&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New team onboard&lt;/td&gt;
&lt;td&gt;Reinvent folders&lt;/td&gt;
&lt;td&gt;Clone RFC skeleton&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud handoff&lt;/td&gt;
&lt;td&gt;Keys at root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fraud/thresholds/*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML ops pool cut&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;batchSize&lt;/code&gt; typo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ml/embedding/worker_pool_size&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform audit&lt;/td&gt;
&lt;td&gt;Inconsistent depth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max_depth&lt;/code&gt; enforced in CI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nested paths are O(1) SDK lookup&lt;/strong&gt; — depth does not add network hops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shallow standard domains&lt;/strong&gt; — faster human navigation in dashboard than flat 200 keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;OpsTreePaths&lt;/code&gt; wrapper&lt;/strong&gt; — compile-time method names; tree stays flexible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared layout across Java/Python&lt;/strong&gt; — same strings in both SDKs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACL by folder prefix&lt;/strong&gt; — security without per-key IAM sprawl&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Cross-team consistency&lt;/th&gt;
&lt;th&gt;On-call grep&lt;/th&gt;
&lt;th&gt;Dashboard UX&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flat KV keys&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;Key name only&lt;/td&gt;
&lt;td&gt;Long list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-team custom&lt;/td&gt;
&lt;td&gt;Divergent&lt;/td&gt;
&lt;td&gt;Painful&lt;/td&gt;
&lt;td&gt;Confusing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RFC folder domains&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Strong&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Predictable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tree navigation&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use nested ops trees in Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Secrets&lt;/td&gt;
&lt;td&gt;Vault — never nested in hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infra replica counts&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product experiment flags&lt;/td&gt;
&lt;td&gt;Feature-flag tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single bootstrap URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Publish internal RFC &lt;code&gt;layout_version: 2026.1&lt;/code&gt; with domain table above.&lt;/li&gt;
&lt;li&gt;Create profile with &lt;code&gt;conventions/&lt;/code&gt; metadata folder.&lt;/li&gt;
&lt;li&gt;Refactor three root-level floats into &lt;code&gt;fraud/thresholds/&lt;/code&gt; or &lt;code&gt;resilience/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;OpsTreePaths&lt;/code&gt; (or Python module constants for path strings).&lt;/li&gt;
&lt;li&gt;PR linter: reject new ops keys at profile root.&lt;/li&gt;
&lt;li&gt;Link RFC from &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-ops-knob-taxonomy.md" rel="noopener noreferrer"&gt;ops knob taxonomy&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-microservices-collaboration.md" rel="noopener noreferrer"&gt;Microservices collaboration tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-ops-knob-taxonomy.md" rel="noopener noreferrer"&gt;Ops knob taxonomy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — conventions turn nested trees into a shared language fraud and catalog teams both read at 3 AM.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Peak Event Posture Flip — One Tree, Many Knobs (Java SDK)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 23:56:31 +0000</pubDate>
      <link>https://dev.to/kiponos/peak-event-posture-flip-one-tree-many-knobs-java-sdk-1gpa</link>
      <guid>https://dev.to/kiponos/peak-event-posture-flip-one-tree-many-knobs-java-sdk-1gpa</guid>
      <description>&lt;p&gt;Cyber Monday 00:04 UTC. Traffic &lt;strong&gt;5.1×&lt;/strong&gt; baseline. Three engineers execute runbook steps in parallel: one raises rate limits in Redis, one edits cache TTL in Helm, one toggles a feature flag for recommendations. Limits rise before TTLs extend; catalog Postgres saturates; checkout still capped at normal-week RPM.&lt;/p&gt;

&lt;p&gt;The SRE manager:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Peak posture is &lt;strong&gt;one coordinated flip&lt;/strong&gt; — not three tools drifting apart. I want &lt;strong&gt;&lt;code&gt;posture.mode: peak&lt;/code&gt;&lt;/strong&gt; to raise RPM, TTL, and pool size &lt;strong&gt;together&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This pattern defines &lt;strong&gt;peak event posture flip&lt;/strong&gt; — a single boolean (or enum) drives many knobs in one Kiponos profile. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; profile &lt;code&gt;['peak']['prod']['posture']&lt;/code&gt; holds coordinated limits for &lt;strong&gt;Cyber Monday — single posture flip&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — uncorrelated peak knobs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;RATE_LIMIT_RPM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;CACHE_TTL_SEC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;WORKER_POOL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each knob in a different store:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Knob&lt;/th&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Flip latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RPM 4000 → 9000&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache TTL 60 → 300&lt;/td&gt;
&lt;td&gt;Helm&lt;/td&gt;
&lt;td&gt;PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pool 16 → 32&lt;/td&gt;
&lt;td&gt;ConfigMap&lt;/td&gt;
&lt;td&gt;Rollout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Partial peak posture&lt;/strong&gt; is worse than none — higher RPM with short TTL &lt;strong&gt;amplifies&lt;/strong&gt; origin load.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Flip limits first, TTL later"&lt;/td&gt;
&lt;td&gt;Origin dies in the gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Peak flags are booleans enough"&lt;/td&gt;
&lt;td&gt;TTLs and RPM are &lt;strong&gt;ints&lt;/strong&gt; — flags awkward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Each team owns its peak keys"&lt;/td&gt;
&lt;td&gt;Coordination &lt;strong&gt;fails&lt;/strong&gt; at 00:04 UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Auto-scale is peak posture"&lt;/td&gt;
&lt;td&gt;New pods inherit &lt;strong&gt;normal&lt;/strong&gt; constants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Runbook order is sufficient"&lt;/td&gt;
&lt;td&gt;Humans parallelize under stress&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Peak posture is a mode, not a scatter plot of keys.&lt;/strong&gt; One &lt;code&gt;posture.mode_enabled&lt;/code&gt; (or &lt;code&gt;posture.mode: peak&lt;/code&gt;) selects &lt;strong&gt;entire subtrees&lt;/strong&gt; — rate limits, TTLs, pools, degradation — read atomically from local tree on each request.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Kiponos.io is for posture flip
&lt;/h2&gt;

&lt;p&gt;WebSocket hub; profile &lt;code&gt;['peak']['prod']['posture']&lt;/code&gt;. Flip &lt;code&gt;posture.mode_enabled: true&lt;/code&gt;; services resolve &lt;strong&gt;peak vs normal&lt;/strong&gt; pairs via local &lt;code&gt;getBool()&lt;/code&gt; + &lt;code&gt;getInt()&lt;/code&gt; — no restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhh50j9ntt6r0iacuvsl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhh50j9ntt6r0iacuvsl.png" alt="Architecture diagram" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree — normal/peak pairs under one posture root
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;posture/&lt;/span&gt;
  &lt;span class="s"&gt;mode_enabled&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="s"&gt;mode_name&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;normal&lt;/span&gt;
  &lt;span class="s"&gt;auto_enable_multiplier&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4.0&lt;/span&gt;
&lt;span class="s"&gt;rate_limits/&lt;/span&gt;
  &lt;span class="s"&gt;normal_rpm&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4000&lt;/span&gt;
  &lt;span class="na"&gt;peak_rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9000&lt;/span&gt;
  &lt;span class="na"&gt;normal_per_ip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;peak_per_ip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;180&lt;/span&gt;
&lt;span class="s"&gt;cache/&lt;/span&gt;
  &lt;span class="s"&gt;normal_product_ttl_sec&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;peak_product_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
  &lt;span class="na"&gt;normal_category_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
  &lt;span class="na"&gt;peak_category_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;
&lt;span class="s"&gt;workers/&lt;/span&gt;
  &lt;span class="s"&gt;normal_pool_size&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;
  &lt;span class="na"&gt;peak_pool_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
  &lt;span class="na"&gt;normal_queue_depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2000&lt;/span&gt;
  &lt;span class="na"&gt;peak_queue_depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;span class="s"&gt;degrade/&lt;/span&gt;
  &lt;span class="s"&gt;peak_shed_recommendations&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="s"&gt;peak_shed_reviews&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="s"&gt;audit/&lt;/span&gt;
  &lt;span class="s"&gt;last_posture_flip&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;normal&lt;/span&gt;
  &lt;span class="s"&gt;last_flip_at_ms&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;last_flip_by&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['peak']['prod']['posture']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — posture resolver pattern (Java)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.Kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PeakPostureResolver&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PeakPostureResolver&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;afterValueChanged&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"posture/mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;warn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Peak posture flip: mode_enabled={}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newValue&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"posture"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;rateLimitRpm&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rate_limits"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_rpm"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"normal_rpm"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;rateLimitPerIp&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rate_limits"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_per_ip"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"normal_per_ip"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;productCacheTtlSec&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cache"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_product_ttl_sec"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"normal_product_ttl_sec"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;workerPoolSize&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"workers"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;workers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_pool_size"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;workers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"normal_pool_size"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;shouldShedRecommendations&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"degrade"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_shed_recommendations"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onTrafficMultiplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"posture"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;isPeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFloat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"auto_enable_multiplier"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_name"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"audit"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"last_flip_by"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"traffic_auto"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PeakPostureResolver&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CartResponse&lt;/span&gt; &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;rateLimiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryAcquire&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rateLimitPerIp&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TooManyRequestsException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;productCacheTtlSec&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;cartLogic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;catalogCache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sku&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python checkout worker — same posture profile
&lt;/h3&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;peak&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;posture&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;is_peak&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;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;posture&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mode_enabled&lt;/span&gt;&lt;span class="sh"&gt;"&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;worker_pool_size&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workers&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="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;peak_pool_size&lt;/span&gt;&lt;span class="sh"&gt;"&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;is_peak&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;normal_pool_size&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;
  
  
  Posture flip runbook — single edit
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Tree change&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enter peak&lt;/td&gt;
&lt;td&gt;&lt;code&gt;posture.mode_enabled: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All resolvers select peak_* keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit peak&lt;/td&gt;
&lt;td&gt;&lt;code&gt;posture.mode_enabled: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restore normal_*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto peak&lt;/td&gt;
&lt;td&gt;Traffic ≥ &lt;code&gt;auto_enable_multiplier&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;traffic_auto&lt;/code&gt; flip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;audit.last_flip_by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hub actor log&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Scattered peak knobs&lt;/th&gt;
&lt;th&gt;Single posture flip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cyber Monday — single posture flip&lt;/td&gt;
&lt;td&gt;Three tools; partial state&lt;/td&gt;
&lt;td&gt;One boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origin protection&lt;/td&gt;
&lt;td&gt;TTL raised; RPM still low&lt;/td&gt;
&lt;td&gt;Coordinated peak pair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wind-down&lt;/td&gt;
&lt;td&gt;Missed Redis key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mode_enabled: false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load test rehearsal&lt;/td&gt;
&lt;td&gt;Staging diverges&lt;/td&gt;
&lt;td&gt;Same tree layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-enable&lt;/td&gt;
&lt;td&gt;Human asleep at 00:04&lt;/td&gt;
&lt;td&gt;&lt;code&gt;onTrafficMultiplier&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;isPeak()&lt;/code&gt; one read&lt;/strong&gt; — amortized across resolver methods per request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single delta&lt;/strong&gt; on flip — not N ConfigMap rollouts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normal/peak pairs in memory&lt;/strong&gt; — no runtime math beyond branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python + Java share profile&lt;/strong&gt; — checkout worker and cart-api aligned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;@RefreshScope&lt;/code&gt;&lt;/strong&gt; — pool size via binder optional; reads immediate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Coordinated flip&lt;/th&gt;
&lt;th&gt;Int knobs + bool mode&lt;/th&gt;
&lt;th&gt;Sub-second&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Redis + Helm + flags&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confluence runbook&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Narrative only&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiponos posture tree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use this pattern
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Better home&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cluster autoscaling min/max&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN edge rules&lt;/td&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permanent capacity planning&lt;/td&gt;
&lt;td&gt;Architecture RFC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product A/B during peak&lt;/td&gt;
&lt;td&gt;Feature flags&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;['peak']['prod']['posture']&lt;/code&gt; with normal/peak pairs above.&lt;/li&gt;
&lt;li&gt;Implement &lt;code&gt;PeakPostureResolver&lt;/code&gt;; inject into cart, catalog, checkout.&lt;/li&gt;
&lt;li&gt;Replace scattered peak constants with resolver methods.&lt;/li&gt;
&lt;li&gt;Staging: single flip &lt;code&gt;posture.mode_enabled: true&lt;/code&gt; — verify RPM, TTL, pool together.&lt;/li&gt;
&lt;li&gt;Wire &lt;code&gt;onTrafficMultiplier&lt;/code&gt; to traffic dashboard metric.&lt;/li&gt;
&lt;li&gt;Runbook: one step — &lt;em&gt;"Enable peak posture in Kiponos."&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-live-runbook-tree-template.md" rel="noopener noreferrer"&gt;Live runbook tree template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-arch-black-friday-runbook-live.md" rel="noopener noreferrer"&gt;Black Friday runbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — peak posture is one flip, not three engineers and four tools at midnight.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Anti-Pattern: DIY Consul Watch — Stale Cache and Hammered KV (Java SDK)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 21:39:45 +0000</pubDate>
      <link>https://dev.to/kiponos/anti-pattern-diy-consul-watch-stale-cache-and-hammered-kv-java-sdk-5e3</link>
      <guid>https://dev.to/kiponos/anti-pattern-diy-consul-watch-stale-cache-and-hammered-kv-java-sdk-5e3</guid>
      <description>&lt;p&gt;Postmortem readout. Authorization blocked legitimate transactions for &lt;strong&gt;eleven minutes&lt;/strong&gt; after fraud raised &lt;code&gt;block_score&lt;/code&gt; from 88 → 82 in Consul KV. Root cause line item:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"JVM services used &lt;strong&gt;Consul long-poll&lt;/strong&gt; with a &lt;strong&gt;30-second local cache&lt;/strong&gt; to reduce KV load during catalog watch storms."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The pattern has a name: &lt;strong&gt;DIY Consul watch + TTL cache&lt;/strong&gt;. This article documents the anti-pattern so teams stop repeating it — and know what to build instead with &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt;. Context: &lt;strong&gt;stale fraud score — postmortem anti-pattern&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — the anti-pattern in production code
&lt;/h2&gt;

&lt;p&gt;Phase 1 — naive watch (works until Black Friday):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Scheduled&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixedDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;refreshFromConsul&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;consulClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKVValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"config/payments/fraud/block_score"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blockScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phase 2 — "optimize" with cache after watch storms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CachedConsulFraudConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;CACHE_TTL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// the lie&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;volatile&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt; &lt;span class="n"&gt;cachedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EPOCH&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;between&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cachedAt&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;getSeconds&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;CACHE_TTL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;refreshFromConsul&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// still blocking; still storm-prone&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phase 3 — incident: fraud sets KV to &lt;strong&gt;82&lt;/strong&gt;; auth reads &lt;strong&gt;88&lt;/strong&gt; for up to &lt;strong&gt;30s&lt;/strong&gt; per pod × hundreds of pods.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"30s cache is safe for config"&lt;/td&gt;
&lt;td&gt;Fraud incidents need &lt;strong&gt;sub-second&lt;/strong&gt; convergence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Watch is real-time enough"&lt;/td&gt;
&lt;td&gt;Watch storms → cache → &lt;strong&gt;staleness&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We can tune TTL per key"&lt;/td&gt;
&lt;td&gt;Per-key TTL &lt;strong&gt;complexity&lt;/strong&gt; without product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Consul is strongly consistent"&lt;/td&gt;
&lt;td&gt;Consistency ≠ &lt;strong&gt;your JVM's cached copy&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We will fix after config v2"&lt;/td&gt;
&lt;td&gt;v2 becomes &lt;strong&gt;Kiponos-shaped hub&lt;/strong&gt; — build or buy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DIY Consul watch trades KV load for stale hot-path reads.&lt;/strong&gt; The anti-pattern is not Consul — it is using KV as a config product without an SDK contract for &lt;strong&gt;local, immediate &lt;code&gt;get*()&lt;/code&gt; after delta&lt;/strong&gt;. Delete the cache lie; adopt WebSocket hub semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-pattern anatomy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1tkvh68w1q2c8b8316a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1tkvh68w1q2c8b8316a.png" alt="Architecture diagram" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Failure mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KV write&lt;/td&gt;
&lt;td&gt;Correct value stored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watch delivery&lt;/td&gt;
&lt;td&gt;Delayed under load; skipped on cache hit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local TTL cache&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Serves old value intentionally&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot path&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;authorize()&lt;/strong&gt; trusts cache&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Replacement pattern — Kiponos hub
&lt;/h2&gt;

&lt;p&gt;Profile &lt;code&gt;['payments']['prod']['consul']&lt;/code&gt; or migrate to &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;payments_ops/&lt;/span&gt;
  &lt;span class="s"&gt;fraud/&lt;/span&gt;
    &lt;span class="s"&gt;thresholds/&lt;/span&gt;
      &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
      &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;67&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;migration/&lt;/span&gt;
    &lt;span class="s"&gt;consul_kv_deprecated&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="s"&gt;local_cache_ttl_sec&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;   &lt;span class="c1"&gt;# document anti-pattern — never again&lt;/span&gt;
&lt;span class="s"&gt;audit/&lt;/span&gt;
  &lt;span class="s"&gt;postmortem_stale_cache_incident&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-03-14"&lt;/span&gt;
  &lt;span class="na"&gt;consul_watch_removed_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — delete watch; local tree read
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AntiPatternReplacement&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="nf"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.team-id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.access-key}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;profilePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"['payments']['prod']['live']"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FraudGate&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FraudGate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;afterValueChanged&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fraud threshold delta — no cache layer: {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newValue&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payments_ops"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Delete:&lt;/strong&gt; &lt;code&gt;@Scheduled&lt;/code&gt; Consul poll, &lt;code&gt;CACHE_TTL&lt;/code&gt;, &lt;code&gt;volatile cachedAt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection checklist — do you have this anti-pattern?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Present?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;consul watch&lt;/code&gt; or &lt;code&gt;@Scheduled&lt;/code&gt; KV refresh&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local &lt;code&gt;ConcurrentHashMap&lt;/code&gt; + TTL for config&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comment "reduce Consul load"&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different cache TTLs per service&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postmortem "stale config"&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Any two → anti-pattern confirmed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;DIY Consul watch&lt;/th&gt;
&lt;th&gt;Kiponos replacement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stale fraud score postmortem&lt;/td&gt;
&lt;td&gt;30s cache lie&lt;/td&gt;
&lt;td&gt;Delta; immediate &lt;code&gt;getInt()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Black Friday watch storm&lt;/td&gt;
&lt;td&gt;Catalog hammers KV&lt;/td&gt;
&lt;td&gt;One WebSocket per JVM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-incident threshold lower&lt;/td&gt;
&lt;td&gt;KV correct; JVM stale&lt;/td&gt;
&lt;td&gt;Dashboard → all pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New service copy-paste&lt;/td&gt;
&lt;td&gt;Spreads anti-pattern&lt;/td&gt;
&lt;td&gt;SDK &lt;code&gt;path()&lt;/code&gt; only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consul outage&lt;/td&gt;
&lt;td&gt;Cache serves unknown age&lt;/td&gt;
&lt;td&gt;Last merged tree local&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consul poll at 5s × 400 pods&lt;/strong&gt; — KV QPS explosion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30s cache&lt;/strong&gt; — saves KV; &lt;strong&gt;costs revenue&lt;/strong&gt; on fraud path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiponos delta&lt;/strong&gt; — O(1) memory patch; no intentional staleness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot-path read&lt;/strong&gt; — nanoseconds; no base64 decode from KV&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch storm eliminated&lt;/strong&gt; — hub push model&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Avoids stale cache lie&lt;/th&gt;
&lt;th&gt;Hot-path local read&lt;/th&gt;
&lt;th&gt;Ops dashboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DIY Consul + TTL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cached&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consul alone no cache&lt;/td&gt;
&lt;td&gt;KV storm risk&lt;/td&gt;
&lt;td&gt;Poll RTT&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis pub/sub refresh&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Poll&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiponos hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Built-in&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keep on Consul&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service registration&lt;/td&gt;
&lt;td&gt;Native strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health checks&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mesh intentions&lt;/td&gt;
&lt;td&gt;Platform choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leader election&lt;/td&gt;
&lt;td&gt;etcd/Consul&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes) — excise anti-pattern
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Grep codebase for &lt;code&gt;consul&lt;/code&gt;, &lt;code&gt;CACHE_TTL&lt;/code&gt;, &lt;code&gt;@Scheduled&lt;/code&gt; + &lt;code&gt;getKVValue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;; import &lt;code&gt;block_score&lt;/code&gt; from KV path.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;CachedConsulFraudConfig&lt;/code&gt; with &lt;code&gt;FraudGate&lt;/code&gt; snippet above.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;migration.consul_kv_deprecated: true&lt;/code&gt; in tree.&lt;/li&gt;
&lt;li&gt;Load test: change &lt;code&gt;block_score&lt;/code&gt; in dashboard; verify &lt;strong&gt;zero&lt;/strong&gt; stale window.&lt;/li&gt;
&lt;li&gt;Leave Consul agent for &lt;strong&gt;service discovery only&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-vs-consul-etcd.md" rel="noopener noreferrer"&gt;Kiponos vs Consul/etcd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-diy-consul-when-stop.md" rel="noopener noreferrer"&gt;DIY Consul when to stop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — the anti-pattern is the cache lie, not Consul. Delete the TTL; keep the local read.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kiponos Java SDK 5.0 What’s New — Developer Guide</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 21:38:06 +0000</pubDate>
      <link>https://dev.to/kiponos/kiponos-java-sdk-50-whats-new-developer-guide-533m</link>
      <guid>https://dev.to/kiponos/kiponos-java-sdk-50-whats-new-developer-guide-533m</guid>
      <description>&lt;h1&gt;
  
  
  Kiponos Java SDK 5.0 What’s New — Developer Guide
&lt;/h1&gt;

&lt;p&gt;This is the &lt;strong&gt;technical companion&lt;/strong&gt; to the 5.0 milestone announcement: what changed, how modes behave, how to read config with the Folder API, and how to upgrade cleanly.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5.0.0.260710&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maven group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;io.kiponos&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Artifacts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sdk-boot-3&lt;/code&gt; (recommended), &lt;code&gt;sdk-boot-2&lt;/code&gt; (legacy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Released&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2026-07-12 (Maven Central)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Happy product story: &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-sdk-5-state-pattern.md" rel="noopener noreferrer"&gt;SDK 5.0 milestone post&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Summary for busy engineers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;5.0 productizes client reliability&lt;/strong&gt; using a classic state pattern behind a stable facade:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Config reads&lt;/th&gt;
&lt;th&gt;Mutations / hooks&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ready&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connected to hub&lt;/td&gt;
&lt;td&gt;Live in-memory tree&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Production happy path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disconnected but LKG available&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Last Known Good&lt;/strong&gt; (read-only)&lt;/td&gt;
&lt;td&gt;No-op / ignored&lt;/td&gt;
&lt;td&gt;Survives hub blips without inventing values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fail-closed&lt;/td&gt;
&lt;td&gt;Empty / null-safe&lt;/td&gt;
&lt;td&gt;No-op&lt;/td&gt;
&lt;td&gt;Diagnostic dumps must &lt;strong&gt;not&lt;/strong&gt; overwrite LKG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Public entry remains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You &lt;strong&gt;do not&lt;/strong&gt; receive mode instances as the API surface. Modes switch internally. Query with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCurrentMode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isReadyMode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isOfflineMode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isSafeMode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Install
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gradle — Boot 3
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.kiponos:sdk-boot-3:5.0.0.260710'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gradle — Boot 2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.kiponos:sdk-boot-2:5.0.0.260710'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Runtime inputs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;env &lt;code&gt;KIPONOS_ID&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access&lt;/td&gt;
&lt;td&gt;env &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile / tree slice&lt;/td&gt;
&lt;td&gt;JVM &lt;code&gt;-Dkiponos="['App']['1.0.0']['dev']['base']"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tokens and profile come from the Kiponos &lt;strong&gt;Connect&lt;/strong&gt; screen for your team.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sdk-common&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; a separate app dependency for consumers — boot jars include shared classes (fat-jar pattern).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Architecture (state pattern)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application code
      │
      ▼
Kiponos / KiponosBase     ◄── stable facade (one reference for app lifetime)
      │
      ▼
volatile SdkState
      ├── ReadyMode*     → live WebSocket + full Folder ops
      ├── OfflineMode*   → LKG reads only
      └── SafeMode*      → fail-closed + safe diagnostic dump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Design rule:&lt;/strong&gt; never return Ready/Offline/Safe objects to callers.&lt;br&gt;&lt;br&gt;
Returning a mode freezes the application on that mode forever.&lt;/p&gt;

&lt;p&gt;Boot modules stay thin adapters (&lt;code&gt;ReadyModeBoot3&lt;/code&gt;, connection controllers) over &lt;code&gt;sdk-common&lt;/code&gt; cores.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Folder API (the surface you code against)
&lt;/h2&gt;

&lt;p&gt;Root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;KiponosFolder&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Navigation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;KiponosFolder&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"server"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// or stepwise:&lt;/span&gt;
&lt;span class="nc"&gt;KiponosFolder&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"server"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful members (conceptual contract):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;path(String... folders)
folder(String folderName)
folderOrCreate(String folderName)
createFolder / renameFolder / deleteFolder / hasFolder
getFolderName / getFolders

get(String key)
get(String key, String def)
getInt(String key)
set(String key, String value)
hasKey(String keyName)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recommended reads
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Prefer typed getters on the SDK surface&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"server"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"port"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"deploy"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"region"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"eu-west-1"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Avoid&lt;/strong&gt; &lt;code&gt;Integer.parseInt(folder.get("port"))&lt;/code&gt; for normal integer keys — use &lt;strong&gt;&lt;code&gt;getInt&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writes (Ready mode)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"feature-flags"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"checkout-v2"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Offline/safe modes, mutations are intentionally &lt;strong&gt;no-ops&lt;/strong&gt; (do not assume silent remote write).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Last Known Good (LKG)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Intent
&lt;/h3&gt;

&lt;p&gt;When the hub is unreachable, apps should continue with a &lt;strong&gt;known good snapshot&lt;/strong&gt;, not hang and not invent random defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  Behavior sketch (5.0)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Live tree healthy&lt;/td&gt;
&lt;td&gt;Ready serves live data; LKG can be refreshed from good state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disconnect / unreachable&lt;/td&gt;
&lt;td&gt;Prefer &lt;strong&gt;Offline&lt;/strong&gt; with LKG reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No trustworthy backup&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Safe&lt;/strong&gt; fail-closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safe diagnostic dump&lt;/td&gt;
&lt;td&gt;Writes &lt;strong&gt;safe-dump-&lt;/strong&gt;* style artifacts — &lt;strong&gt;never&lt;/strong&gt; overwrites LKG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LKG resolution conceptually prefers: live memory → backup → on-disk LKG file under the SDK dump location.&lt;/p&gt;

&lt;h3&gt;
  
  
  App guidance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Treat Offline as &lt;strong&gt;read-only truth of last good&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Do not assume writes succeed without Ready
&lt;/li&gt;
&lt;li&gt;Use mode queries if UI or probes must show “degraded but serving LKG”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Lifecycle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// work&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disconnect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always disconnect on orderly shutdown.
&lt;/li&gt;
&lt;li&gt;Intentional disconnect can remain in Offline rather than surprising flip back to Ready (verify against your mode transition policy).
&lt;/li&gt;
&lt;li&gt;Reconnect recovery continues to improve (see §10 open items).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Upgrade from 4.4.x
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Change dependency version to &lt;code&gt;5.0.0.260710&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Rebuild / run tests against staging hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Replace &lt;code&gt;parseInt(get(...))&lt;/code&gt; with &lt;code&gt;getInt&lt;/code&gt; where applicable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Re-test disconnect / reconnect paths (unit + one live smoke)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Optional: surface &lt;code&gt;getCurrentMode()&lt;/code&gt; in health/admin endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Confirm no code assumed “throw and hang” as the only offline strategy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Breaking risk:&lt;/strong&gt; low for pure read apps. Behavioral change is &lt;strong&gt;improved&lt;/strong&gt; offline safety; re-validate anything that depended on exceptions during disconnect.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Example: Spring-friendly service skeleton
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.Kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.configs.KiponosFolder&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.annotation.PreDestroy&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// or jakarta.annotation.PreDestroy on Boot 3&lt;/span&gt;

&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckoutLimits&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;KiponosFolder&lt;/span&gt; &lt;span class="n"&gt;limits&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CheckoutLimits&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"checkout"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"limits"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;maxCartItems&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;limits&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-cart-items"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;currency&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;limits&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"currency"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"USD"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@PreDestroy&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disconnect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dashboard changes to &lt;code&gt;checkout/limits/*&lt;/code&gt; propagate live while Ready; Offline continues serving LKG values.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Example config tree (dashboard)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustrative tree under your profile base&lt;/span&gt;
&lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;max-cart-items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;USD&lt;/span&gt;
    &lt;span class="na"&gt;soft-hold-seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;span class="na"&gt;feature-flags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;checkout-v2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
  &lt;span class="na"&gt;dark-launch-percent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operators edit in the Kiponos web UI; apps read via Folder navigation — no redeploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Known follow-ups (honest roadmap)
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;not&lt;/strong&gt; blockers for adopting 5.0:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mode-change hooks&lt;/td&gt;
&lt;td&gt;e.g. &lt;code&gt;onRecovered&lt;/code&gt;, &lt;code&gt;onSwitchToSafeMode&lt;/code&gt; for app callbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safe → Ready recovery polish&lt;/td&gt;
&lt;td&gt;Explicit policy after fail-closed recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full live multi-mode matrix in CI&lt;/td&gt;
&lt;td&gt;Broader than unit Offline/Safe matrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boot2 modes parity&lt;/td&gt;
&lt;td&gt;Boot3 is the recommended surface&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  11. Verification checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Dependency resolves from Maven Central
&lt;/li&gt;
&lt;li&gt;[ ] App starts with Connect tokens + profile
&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;getInt&lt;/code&gt; / &lt;code&gt;path&lt;/code&gt; reads match dashboard
&lt;/li&gt;
&lt;li&gt;[ ] Dashboard edit appears without restart (Ready)
&lt;/li&gt;
&lt;li&gt;[ ] Disconnect does not hang process (Offline or Safe)
&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;disconnect()&lt;/code&gt; on shutdown
&lt;/li&gt;
&lt;li&gt;[ ] Optional: game demo on SDK 5.0 for stakeholder demo
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Live demo: &lt;a href="https://github.com/kiponos-io/kiponos-game" rel="noopener noreferrer"&gt;Kiponos Game&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Samples hub: &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;kiponos-io/kiponos-io&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Maven: &lt;a href="https://central.sonatype.com/artifact/io.kiponos/sdk-boot-3" rel="noopener noreferrer"&gt;io.kiponos:sdk-boot-3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Milestone announcement: &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-sdk-5-state-pattern.md" rel="noopener noreferrer"&gt;devto-sdk-5-state-pattern.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Bottom line for engineers:&lt;/strong&gt; bump to &lt;code&gt;5.0.0.260710&lt;/code&gt;, keep using &lt;code&gt;getRootFolder().path(...).getInt(...)&lt;/code&gt;, and treat modes + LKG as the supported reliability model — not an optional cache you reinvent.&lt;/p&gt;

</description>
      <category>api</category>
      <category>java</category>
      <category>springboot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Kiponos Java SDK 5.0 Is Here — Live Config, Calmer Apps, Bigger Smile</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 21:35:37 +0000</pubDate>
      <link>https://dev.to/kiponos/kiponos-java-sdk-50-is-here-live-config-calmer-apps-bigger-smile-1im2</link>
      <guid>https://dev.to/kiponos/kiponos-java-sdk-50-is-here-live-config-calmer-apps-bigger-smile-1im2</guid>
      <description>&lt;p&gt;Some product moments feel like maintenance.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;This one feels like a celebration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today we are proud to ship &lt;strong&gt;Kiponos Java SDK 5.0&lt;/strong&gt; — the release that takes everything teams loved about live dashboard config and makes the client as confident as the product story.&lt;/p&gt;

&lt;p&gt;No restart theater.&lt;br&gt;&lt;br&gt;
No “hope the socket holds.”&lt;br&gt;&lt;br&gt;
Just a calmer, happier way to run apps that stay in sync with the people operating them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Maven Central — available now
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Spring Boot 3 / Jakarta (recommended)&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.kiponos:sdk-boot-3:5.0.0.260710'&lt;/span&gt;

    &lt;span class="c1"&gt;// Spring Boot 2 / javax (legacy)&lt;/span&gt;
    &lt;span class="c1"&gt;// implementation 'io.kiponos:sdk-boot-2:5.0.0.260710'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt; &lt;code&gt;5.0.0.260710&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Group:&lt;/strong&gt; &lt;code&gt;io.kiponos&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Artifacts:&lt;/strong&gt; &lt;code&gt;sdk-boot-3&lt;/code&gt; · &lt;code&gt;sdk-boot-2&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why this is a happy milestone
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; has always been about &lt;strong&gt;joy of control&lt;/strong&gt;: open the dashboard, change a value, and running apps feel it immediately over WebSocket — local reads on the hot path, zero redeploy ritual.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;5.0&lt;/strong&gt;, that joy gets a reliability backbone teams can trust in production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;How it feels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ready&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connected, live tree, full power — the experience you demo and ship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network blip? Keep reading &lt;strong&gt;Last Known Good&lt;/strong&gt; config calmly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nothing trustworthy yet? Fail closed, stay empty-safe, protect LKG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You still hold &lt;strong&gt;one&lt;/strong&gt; object forever: &lt;code&gt;Kiponos&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Modes switch &lt;em&gt;inside&lt;/em&gt; the facade. Your code stays simple. Your ops stay human.&lt;/p&gt;

&lt;p&gt;That design choice is intentional — and a little proud. We learned (the hard way, on an earlier branch) that handing mode objects to apps freezes them on one personality forever. &lt;strong&gt;5.0 keeps the facade stable and the resilience internal.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What you gain in one picture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your app
  └── Kiponos.createForCurrentTeam()
        └── Ready  ·  Offline (LKG)  ·  Safe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Dashboard edits still flow as &lt;strong&gt;live deltas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Hot path still does &lt;strong&gt;local&lt;/strong&gt; &lt;code&gt;get&lt;/code&gt; / &lt;code&gt;getInt&lt;/code&gt; / &lt;code&gt;path(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Disconnects become &lt;strong&gt;modes&lt;/strong&gt;, not meltdowns
&lt;/li&gt;
&lt;li&gt;LKG is a first-class product feature, not a weekend hack&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The API you actually write (typed, clean)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.Kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.configs.KiponosFolder&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;KiponosFolder&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"server"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"port"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode="&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCurrentMode&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;disconnect&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;KiponosFolder&lt;/code&gt; is the navigation surface you already know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;path(...)&lt;/code&gt; / &lt;code&gt;folder(...)&lt;/code&gt; / &lt;code&gt;folderOrCreate(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get&lt;/code&gt; / &lt;code&gt;getInt&lt;/code&gt; / &lt;code&gt;set&lt;/code&gt; / &lt;code&gt;hasKey&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;folder CRUD when you need it
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No string-to-int gymnastics required for integers — &lt;strong&gt;&lt;code&gt;getInt&lt;/code&gt; is the happy path.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Feel it in five minutes (pick your joy)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Golden Java (minimal connect)
&lt;/h3&gt;

&lt;p&gt;Open-source onboarding kit:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt; → &lt;code&gt;golden/java&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kiponos-io/kiponos-io.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kiponos-io/golden/java
&lt;span class="c"&gt;# Connect tokens + profile from your Kiponos account&lt;/span&gt;
./gradlew run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Kiponos Game (visceral demo)
&lt;/h3&gt;

&lt;p&gt;A libGDX arena of shapes controlled &lt;strong&gt;live&lt;/strong&gt; from the dashboard — color, speed, pause, more:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/kiponos-io/kiponos-game" rel="noopener noreferrer"&gt;github.com/Avdiel/kiponos-game&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
(Already on &lt;strong&gt;SDK 5.0&lt;/strong&gt;. Public samples will also live under the &lt;strong&gt;kiponos-io&lt;/strong&gt; account as we grow the showcase.)&lt;/p&gt;

&lt;p&gt;Change a value in the hub. Watch the world respond. That is the product, not a slide.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent skills
&lt;/h3&gt;

&lt;p&gt;If you build with AI agents, the public repo ships an installable skill + &lt;code&gt;AGENTS.md&lt;/code&gt; so integration is machine-readable, not folklore.&lt;/p&gt;




&lt;h2&gt;
  
  
  For teams already on 4.x
&lt;/h2&gt;

&lt;p&gt;Upgrade is mostly &lt;strong&gt;additive confidence&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bump to &lt;code&gt;5.0.0.260710&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; and &lt;code&gt;-Dkiponos="['app']['…']['…']['…']"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;getInt&lt;/code&gt; / folder navigation over ad-hoc parsing
&lt;/li&gt;
&lt;li&gt;Optionally branch ops UI on &lt;code&gt;isReadyMode()&lt;/code&gt; / &lt;code&gt;isOfflineMode()&lt;/code&gt; / &lt;code&gt;isSafeMode()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;disconnect()&lt;/code&gt; on shutdown (same good citizenship as always)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full technical detail lives in the companion guide:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-sdk-5-whats-new-guide.md" rel="noopener noreferrer"&gt;SDK 5.0 What’s New — Developer Guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What this says about where we’re going
&lt;/h2&gt;

&lt;p&gt;5.0 is a &lt;strong&gt;major&lt;/strong&gt; because the client contract matured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resilience is &lt;strong&gt;productized&lt;/strong&gt;, not “reconnect harder”
&lt;/li&gt;
&lt;li&gt;LKG is &lt;strong&gt;real&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;modes are &lt;strong&gt;observable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Boot 3 and Boot 2 ship together on Central
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re still building (mode hooks, deeper recovery polish, richer demos).&lt;br&gt;&lt;br&gt;
But the floor just rose — and that is worth a smile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;To everyone who signed up, clicked around, or integrated Kiponos quietly: &lt;strong&gt;this release is for you.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Live config should feel light in the demo and steady in production. &lt;strong&gt;5.0 is our happy step toward both.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ship the dependency. Keep the dashboard open. Enjoy the loop.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maven (boot-3)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://central.sonatype.com/artifact/io.kiponos/sdk-boot-3" rel="noopener noreferrer"&gt;central.sonatype.com/artifact/io.kiponos/sdk-boot-3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public docs &amp;amp; samples&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live game demo&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/kiponos-io/kiponos-game" rel="noopener noreferrer"&gt;github.com/Avdiel/kiponos-game&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical What’s New&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-sdk-5-whats-new-guide.md" rel="noopener noreferrer"&gt;devto-sdk-5-whats-new-guide.md&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Kiponos Java SDK 5.0.0.260710 — with pride.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ops Knob Taxonomy — Classify Keys Before You Drown in Tools (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 19:22:41 +0000</pubDate>
      <link>https://dev.to/kiponos/ops-knob-taxonomy-classify-keys-before-you-drown-in-tools-architecture-2cao</link>
      <guid>https://dev.to/kiponos/ops-knob-taxonomy-classify-keys-before-you-drown-in-tools-architecture-2cao</guid>
      <description>&lt;p&gt;Config sprawl retro. Engineering counted &lt;strong&gt;1,240 keys&lt;/strong&gt; across Helm, Vault paths, LaunchDarkly, Redis hashes, and &lt;code&gt;static final&lt;/code&gt; constants. Nobody could answer which store owned &lt;code&gt;failure_rate_threshold&lt;/code&gt;. The platform lead assigns homework:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tag every key with a &lt;strong&gt;knob class&lt;/strong&gt; before we buy another tool. I want a &lt;strong&gt;taxonomy&lt;/strong&gt;, not another diagram."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This pattern defines four classes — &lt;strong&gt;bootstrap&lt;/strong&gt;, &lt;strong&gt;operational&lt;/strong&gt;, &lt;strong&gt;experiment&lt;/strong&gt;, &lt;strong&gt;secret&lt;/strong&gt; — and maps each to its home. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; owns &lt;strong&gt;operational&lt;/strong&gt; knobs in nested trees with local Java/Python reads. Use during &lt;strong&gt;config sprawl retro — tag every key by class&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — untagged keys become political
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Untagged sprawl&lt;/span&gt;
&lt;span class="na"&gt;payments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;block_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;           &lt;span class="c1"&gt;# which class?&lt;/span&gt;
  &lt;span class="na"&gt;replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;
  &lt;span class="na"&gt;stripe_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk_live_xxx&lt;/span&gt;
  &lt;span class="na"&gt;newCheckout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;BLOCK_SCORE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// operational — filed as "config"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without taxonomy, incidents become tool debates. Without a &lt;strong&gt;hub for operational class&lt;/strong&gt;, teams build Redis layer #4.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Teams know where keys belong"&lt;/td&gt;
&lt;td&gt;Onboarding repeats &lt;strong&gt;same arguments&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Naming conventions are enough"&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;prod_payments_flag_v2&lt;/code&gt; does not imply &lt;strong&gt;class&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We will tag later"&lt;/td&gt;
&lt;td&gt;Later is &lt;strong&gt;during an incident&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Taxonomy is bureaucracy"&lt;/td&gt;
&lt;td&gt;Untagged keys cost &lt;strong&gt;bridge hours&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"One tool can hold all classes"&lt;/td&gt;
&lt;td&gt;Mixed classes &lt;strong&gt;couple&lt;/strong&gt; rotation to fraud tuning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Knob class precedes tool choice.&lt;/strong&gt; Bootstrap declares wiring. Operational tunes runtime under load. Experiment targets cohorts. Secret proves identity. Tag first; then Vault, GitOps, feature flags, or Kiponos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taxonomy — four classes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;knob_class&lt;/code&gt; tag&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;bootstrap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bootstrap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wiring that changes quarterly via review&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;GitOps / YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;operational&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hot-path floats; incident/peak edits in seconds&lt;/td&gt;
&lt;td&gt;SRE / fraud / FinOps&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;experiment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;experiment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User cohort product behavior&lt;/td&gt;
&lt;td&gt;Product / growth&lt;/td&gt;
&lt;td&gt;Statsig / LD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;secret&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;secret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Credentials and key material&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3ii2btqwvqp1ms0sk8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr3ii2btqwvqp1ms0sk8h.png" alt="Architecture diagram" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Taxonomy registry tree — metadata pattern
&lt;/h2&gt;

&lt;p&gt;Store classification &lt;strong&gt;in the hub&lt;/strong&gt; for operational keys; use a &lt;strong&gt;registry folder&lt;/strong&gt; for cross-team index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;taxonomy/&lt;/span&gt;
  &lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026.1"&lt;/span&gt;
  &lt;span class="na"&gt;classes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Git-reviewed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wiring;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rare&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;change"&lt;/span&gt;
    &lt;span class="na"&gt;ops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hot-path;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incident&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;latency&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;seconds"&lt;/span&gt;
    &lt;span class="na"&gt;experiment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cohort&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;targeting"&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vault&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;only&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;never&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hub"&lt;/span&gt;
&lt;span class="s"&gt;registry/&lt;/span&gt;
  &lt;span class="s"&gt;payments.block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ops&lt;/span&gt;
    &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kiponos&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fraud/thresholds/block_score&lt;/span&gt;
  &lt;span class="na"&gt;payments.replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bootstrap&lt;/span&gt;
    &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitops&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;helm/values-prod.yaml&lt;/span&gt;
  &lt;span class="na"&gt;growth.new_checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;experiment&lt;/span&gt;
    &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;statsig&lt;/span&gt;
    &lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new_checkout&lt;/span&gt;
  &lt;span class="na"&gt;payments.db_password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;secret&lt;/span&gt;
    &lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vault&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;secret/data/payments/db&lt;/span&gt;
&lt;span class="s"&gt;fraud/&lt;/span&gt;
  &lt;span class="s"&gt;thresholds/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ops&lt;/span&gt;
&lt;span class="s"&gt;resilience/&lt;/span&gt;
  &lt;span class="s"&gt;payments/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;
    &lt;span class="na"&gt;knob_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ops&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['platform']['prod']['taxonomy']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — class-aware reads (Java)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaxonomyAwareOps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ops class — Kiponos hot path only&lt;/span&gt;
        &lt;span class="n"&gt;assertOpsClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payments.block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;assertOpsClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;registryKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"registry"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;registryKey&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"knob_class"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ops"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="s"&gt;"ops"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalStateException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;registryKey&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" is class "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" — not readable on ops hot path"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python — ops class only on worker
&lt;/h3&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;platform&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;taxonomy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;batch_size&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ml&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;routing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;batch_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Classification worksheet — copy for retro
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Read freq&lt;/th&gt;
&lt;th&gt;Change trigger&lt;/th&gt;
&lt;th&gt;Cohort?&lt;/th&gt;
&lt;th&gt;Secret?&lt;/th&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per auth&lt;/td&gt;
&lt;td&gt;Incident&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replicaCount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;Capacity plan&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;bootstrap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;new_checkout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per session&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;experiment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Statsig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db_password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pool init&lt;/td&gt;
&lt;td&gt;Rotation&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;secret&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failure_rate_threshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per call&lt;/td&gt;
&lt;td&gt;Incident&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ingress.host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;bootstrap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without taxonomy&lt;/th&gt;
&lt;th&gt;With taxonomy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Config sprawl retro&lt;/td&gt;
&lt;td&gt;1,240 untagged keys&lt;/td&gt;
&lt;td&gt;Registry populated in one sprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM puts &lt;code&gt;block_score&lt;/code&gt; in Statsig&lt;/td&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;td&gt;Registry says &lt;strong&gt;ops&lt;/strong&gt; → redirect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New hire adds float to Vault&lt;/td&gt;
&lt;td&gt;Coupled rotation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;secret&lt;/strong&gt; vs &lt;strong&gt;ops&lt;/strong&gt; gate in review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident edit&lt;/td&gt;
&lt;td&gt;Wrong store latency&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ops&lt;/strong&gt; → dashboard seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor RFP&lt;/td&gt;
&lt;td&gt;"We need everything"&lt;/td&gt;
&lt;td&gt;Taxonomy defines scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ops class on hot path&lt;/strong&gt; — Kiponos local read; taxonomy check is one optional registry read at startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Misclassified secret in hub&lt;/strong&gt; — security incident; taxonomy prevents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiment class on auth path&lt;/strong&gt; — exposure logging cost; taxonomy blocks in design review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootstrap in Redis poll&lt;/strong&gt; — unnecessary staleness; taxonomy sends to GitOps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry in hub&lt;/strong&gt; — same WebSocket; no separate CMDB&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Enforces class boundaries&lt;/th&gt;
&lt;th&gt;Hot-path ops&lt;/th&gt;
&lt;th&gt;Onboarding clarity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naming conventions only&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confluence wiki table&lt;/td&gt;
&lt;td&gt;Stale&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Taxonomy + registry tree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Strong&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos for ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Strong&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single monolithic store&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Coupled&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Home — not Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;secret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bootstrap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;experiment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Feature flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registry metadata for gitops keys&lt;/td&gt;
&lt;td&gt;Git + CODEOWNERS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immutable audit PDF&lt;/td&gt;
&lt;td&gt;Compliance archive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create profile &lt;code&gt;['platform']['prod']['taxonomy']&lt;/code&gt; with &lt;code&gt;taxonomy/&lt;/code&gt;, &lt;code&gt;registry/&lt;/code&gt;, and first &lt;strong&gt;ops&lt;/strong&gt; subtree.&lt;/li&gt;
&lt;li&gt;Export 50 highest-traffic keys from Helm + code; fill classification worksheet.&lt;/li&gt;
&lt;li&gt;Tag registry entries with &lt;code&gt;knob_class&lt;/code&gt; and &lt;code&gt;home&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Migrate ten &lt;strong&gt;ops&lt;/strong&gt; keys into &lt;code&gt;fraud/&lt;/code&gt; and &lt;code&gt;resilience/&lt;/code&gt; folders.&lt;/li&gt;
&lt;li&gt;Add PR checklist: &lt;em&gt;"New key must declare knob_class."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Publish internal RFC linking taxonomy to &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-hot-path-config-checklist.md" rel="noopener noreferrer"&gt;hot-path checklist&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-when-gitops-when-live-config.md" rel="noopener noreferrer"&gt;When GitOps, when live config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-when-not-to-use-live-config.md" rel="noopener noreferrer"&gt;When not to use live config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — tag the class first; the hub owns every key labeled ops.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Live Runbook Tree Template — Peak Posture in One Nested Profile (Java SDK)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 17:05:34 +0000</pubDate>
      <link>https://dev.to/kiponos/live-runbook-tree-template-peak-posture-in-one-nested-profile-java-sdk-n4h</link>
      <guid>https://dev.to/kiponos/live-runbook-tree-template-peak-posture-in-one-nested-profile-java-sdk-n4h</guid>
      <description>&lt;p&gt;SRE guild session. Someone shares a &lt;strong&gt;forty-page Confluence runbook&lt;/strong&gt; for peak season: seventeen steps, four Helm value files, three feature-flag toggles, and a footnote that says &lt;em&gt;"rolling restart required."&lt;/em&gt; The guild lead asks for something copy-pasteable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Give us a &lt;strong&gt;tree template&lt;/strong&gt; — folders, keys, Java wiring — so every team's runbook is a &lt;strong&gt;dashboard flip&lt;/strong&gt;, not a deploy sequence."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This pattern article ships a &lt;strong&gt;reusable live runbook tree&lt;/strong&gt; derived from &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-arch-black-friday-runbook-live.md" rel="noopener noreferrer"&gt;Black Friday runbooks as live config&lt;/a&gt;. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; holds peak posture — rate limits, cache TTLs, queue depths, degradation flags — in profile &lt;code&gt;['runbook']['peak']['posture']&lt;/code&gt;. Clone the template for &lt;strong&gt;peak event — flip runbook tree in one edit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — runbooks as deploy archaeology
&lt;/h2&gt;

&lt;p&gt;Peak runbooks describe &lt;strong&gt;operational knobs&lt;/strong&gt; trapped in non-executable artifacts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="no"&gt;PEAK_MODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;RATE_LIMIT_RPM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# values-peak.yaml — committed days early&lt;/span&gt;
&lt;span class="na"&gt;peak&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rate_limit_rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9000&lt;/span&gt;
  &lt;span class="na"&gt;cache_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confluence step 14: &lt;em&gt;"Merge values-peak and rolling restart cart-api."&lt;/em&gt; Traffic does not wait for step 14.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Runbook rehearsal equals readiness"&lt;/td&gt;
&lt;td&gt;Rehearsal without &lt;strong&gt;live tree&lt;/strong&gt; is theater&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Peak YAML merged Wednesday is fine"&lt;/td&gt;
&lt;td&gt;Traffic shape wrong by peak hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Each service owns its peak constants"&lt;/td&gt;
&lt;td&gt;Coordinated posture &lt;strong&gt;diverges&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Auto-scale replaces runbook limits"&lt;/td&gt;
&lt;td&gt;New pods read &lt;strong&gt;normal-week&lt;/strong&gt; constants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"One template cannot fit all teams"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Folder contract&lt;/strong&gt; scales; values differ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A runbook is a narrative; the tree is the executable.&lt;/strong&gt; Standardize folder layout (&lt;code&gt;peak&lt;/code&gt;, &lt;code&gt;cache&lt;/code&gt;, &lt;code&gt;queues&lt;/code&gt;, &lt;code&gt;degrade&lt;/code&gt;, &lt;code&gt;audit&lt;/code&gt;) so every service team maps runbook steps to &lt;strong&gt;dashboard keys&lt;/strong&gt; — one &lt;code&gt;peak_mode_enabled: true&lt;/code&gt; flip coordinates dozens of knobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Kiponos.io is for runbook trees
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; hydrates profile &lt;code&gt;['runbook']['peak']['posture']&lt;/code&gt; over WebSocket. SRE flips &lt;code&gt;peak.mode_enabled&lt;/code&gt;; deltas patch rate limits, TTLs, and degradation flags. Services read locally on hot paths — no restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56a4f6t09tfyn05q908h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56a4f6t09tfyn05q908h.png" alt="Architecture diagram" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Template config tree — copy this skeleton
&lt;/h2&gt;

&lt;p&gt;Rename values per service; &lt;strong&gt;keep folder names&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;peak/&lt;/span&gt;
  &lt;span class="s"&gt;mode_enabled&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="s"&gt;rate_limit_per_ip&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;peak_rate_limit_per_ip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;180&lt;/span&gt;
  &lt;span class="na"&gt;global_rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4000&lt;/span&gt;
  &lt;span class="na"&gt;peak_global_rpm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9000&lt;/span&gt;
  &lt;span class="na"&gt;return_retry_after_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;auto_enable_on_traffic_multiplier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.5&lt;/span&gt;
&lt;span class="s"&gt;cache/&lt;/span&gt;
  &lt;span class="s"&gt;default_ttl_sec&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;peak_default_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
  &lt;span class="na"&gt;product_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
  &lt;span class="na"&gt;peak_product_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;
  &lt;span class="na"&gt;inventory_ttl_sec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="s"&gt;queues/&lt;/span&gt;
  &lt;span class="s"&gt;checkout_max_depth&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2000&lt;/span&gt;
  &lt;span class="na"&gt;peak_checkout_max_depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
  &lt;span class="na"&gt;reject_above_depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;async_worker_concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;
  &lt;span class="na"&gt;peak_async_worker_concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
&lt;span class="s"&gt;degrade/&lt;/span&gt;
  &lt;span class="s"&gt;recommendations_enabled&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="s"&gt;shed_noncritical_paths&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="s"&gt;noncritical_paths&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/recommendations"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/reviews"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;wishlist_writes_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;partner_webhooks_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="s"&gt;audit/&lt;/span&gt;
  &lt;span class="s"&gt;last_peak_flip_by&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;last_peak_flip_at_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;traffic_multiplier_last&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;
  &lt;span class="na"&gt;runbook_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template-v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['runbook']['peak']['posture']&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adoption rule:&lt;/strong&gt; every runbook step must cite a &lt;strong&gt;tree path&lt;/strong&gt; — e.g. step 7 → &lt;code&gt;cache.peak_product_ttl_sec&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Java integration — peak-aware gate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.kiponos.sdk.Kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RunbookPeakGate&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RunbookPeakGate&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;afterValueChanged&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Runbook tree delta: {} → {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newValue&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;effectiveRateLimitPerIp&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_rate_limit_per_ip"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rate_limit_per_ip"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;effectiveGlobalRpm&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_global_rpm"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"global_rpm"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;effectiveProductTtl&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cache"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak_product_ttl_sec"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"product_ttl_sec"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;shouldShedPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;httpPath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;degrade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"degrade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;degrade&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"shed_noncritical_paths"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;degrade&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"noncritical_paths"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;asStringList&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpPath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;recordTrafficMultiplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"audit"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"traffic_multiplier_last"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"peak"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFloat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"auto_enable_on_traffic_multiplier"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mode_enabled"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"audit"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"last_peak_flip_by"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"traffic_auto"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wire &lt;code&gt;RunbookPeakGate&lt;/code&gt; into rate limiters, cache resolvers, and non-critical route filters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runbook ↔ tree mapping table (template)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runbook step (narrative)&lt;/th&gt;
&lt;th&gt;Tree key&lt;/th&gt;
&lt;th&gt;Normal&lt;/th&gt;
&lt;th&gt;Peak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enable peak mode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;peak.mode_enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raise per-IP limit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;peak.peak_rate_limit_per_ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raise global RPM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;peak.peak_global_rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4000&lt;/td&gt;
&lt;td&gt;9000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extend product cache&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cache.peak_product_ttl_sec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deepen checkout queue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;queues.peak_checkout_max_depth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;8000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shed recommendations&lt;/td&gt;
&lt;td&gt;&lt;code&gt;degrade.shed_noncritical_paths&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Record who flipped&lt;/td&gt;
&lt;td&gt;&lt;code&gt;audit.last_peak_flip_by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;on-call ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Confluence-only runbook&lt;/th&gt;
&lt;th&gt;Live tree template&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Peak event — flip runbook tree in one edit&lt;/td&gt;
&lt;td&gt;Multi-step deploy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;peak.mode_enabled: true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic exceeds rehearsal&lt;/td&gt;
&lt;td&gt;Stale Wednesday YAML&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;traffic_auto&lt;/code&gt; via &lt;code&gt;recordTrafficMultiplier&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wind-down&lt;/td&gt;
&lt;td&gt;Second deploy wave&lt;/td&gt;
&lt;td&gt;&lt;code&gt;peak.mode_enabled: false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New team onboard&lt;/td&gt;
&lt;td&gt;Copy 40-page doc&lt;/td&gt;
&lt;td&gt;Clone tree skeleton + map 6 keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit post-peak&lt;/td&gt;
&lt;td&gt;Git archaeology&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;audit.*&lt;/code&gt; keys in hub log&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Peak mode check: 4–8 local reads&lt;/strong&gt; — noise vs I/O&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single WebSocket delta&lt;/strong&gt; enables coordinated posture — not N Helm releases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No bean recycle&lt;/strong&gt; for TTL and limit changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-enable&lt;/strong&gt; avoids human lag when multiplier threshold breached&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template folders&lt;/strong&gt; prevent per-team key invention on hot path&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;One-edit peak flip&lt;/th&gt;
&lt;th&gt;Coordinated knobs&lt;/th&gt;
&lt;th&gt;Executable runbook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Confluence + Helm&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-service constants&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags (booleans only)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No TTL/queue ints&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiponos template tree&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use this template
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Better home&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cluster node pool capacity&lt;/td&gt;
&lt;td&gt;Cloud autoscaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN edge purge&lt;/td&gt;
&lt;td&gt;Vendor API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database schema migrations&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment certificates&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing copy&lt;/td&gt;
&lt;td&gt;CMS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes) — adopt template
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy YAML skeleton into profile &lt;code&gt;['runbook']['peak']['posture']&lt;/code&gt; (or &lt;code&gt;['your-service']['prod']['live']&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Map your Confluence runbook steps to tree keys using mapping table.&lt;/li&gt;
&lt;li&gt;Paste &lt;code&gt;RunbookPeakGate&lt;/code&gt; pattern; wire three call sites (rate, cache, degrade).&lt;/li&gt;
&lt;li&gt;Staging game day: flip &lt;code&gt;peak.mode_enabled&lt;/code&gt; — verify &lt;strong&gt;no restart&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;audit.runbook_version&lt;/code&gt; to &lt;code&gt;your-team-v1&lt;/code&gt; for change tracking.&lt;/li&gt;
&lt;li&gt;Retire Helm &lt;code&gt;values-peak.yaml&lt;/code&gt; keys that duplicate tree.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-arch-black-friday-runbook-live.md" rel="noopener noreferrer"&gt;Black Friday runbook article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-peak-event-posture-flip.md" rel="noopener noreferrer"&gt;Peak event posture flip pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — clone the tree template once; your runbook stops being a deploy checklist at midnight.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hot-Path Config Checklist — Does This Knob Belong in Kiponos? (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:48:30 +0000</pubDate>
      <link>https://dev.to/kiponos/hot-path-config-checklist-does-this-knob-belong-in-kiponos-architecture-170p</link>
      <guid>https://dev.to/kiponos/hot-path-config-checklist-does-this-knob-belong-in-kiponos-architecture-170p</guid>
      <description>&lt;p&gt;New microservice design review. The team proposes &lt;code&gt;permits_per_second&lt;/code&gt; in &lt;code&gt;application.yml&lt;/code&gt;, &lt;code&gt;block_score&lt;/code&gt; in Redis with 10s poll, and &lt;code&gt;replicaCount&lt;/code&gt; in the same Helm chart. The staff architect stops the review:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Before first deploy — run the &lt;strong&gt;hot-path checklist&lt;/strong&gt;. If we wire this wrong, we spend two years migrating under fire."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the &lt;strong&gt;operational admission checklist&lt;/strong&gt; for &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; — does this knob belong in the live hub? Use it during &lt;strong&gt;new microservice — run checklist before first deploy&lt;/strong&gt; and on every PR that adds configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — knobs land in the wrong store by default
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// What teams ship on day one&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;PERMITS_PER_SECOND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# application.yml — mixed fate&lt;/span&gt;
&lt;span class="na"&gt;resilience4j&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ratelimiter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;limitForPeriod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;    &lt;span class="c1"&gt;# hot-path — wrong home&lt;/span&gt;
&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;                   &lt;span class="c1"&gt;# bootstrap — fine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;BLOCK_SCORE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;  &lt;span class="c1"&gt;# module constant — incident pain later
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a checklist, &lt;strong&gt;every constant becomes technical debt&lt;/strong&gt; the on-call pays during the first BIN attack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"We will externalize before prod"&lt;/td&gt;
&lt;td&gt;Prod arrives; constants stay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Redis is fine for hot-path floats"&lt;/td&gt;
&lt;td&gt;Poll interval = &lt;strong&gt;staleness + tail latency&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"If it's in YAML, GitOps owns it"&lt;/td&gt;
&lt;td&gt;Git PR latency ≠ incident latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Small service doesn't need live config"&lt;/td&gt;
&lt;td&gt;Small services join &lt;strong&gt;shared incidents&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Checklist slows teams"&lt;/td&gt;
&lt;td&gt;One review hour saves &lt;strong&gt;bridge hours&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hot-path knobs are defined by read frequency, change trigger, and latency budget — not by team size.&lt;/strong&gt; If a value is read per request and changed during incidents, it belongs in a live tree with local &lt;code&gt;get*()&lt;/code&gt; — not in constants, Redis poll, or GitOps YAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hot-path admission checklist
&lt;/h2&gt;

&lt;p&gt;Score each proposed key. &lt;strong&gt;YES on any of 1–4&lt;/strong&gt; strongly suggests Kiponos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Section A — Read pattern
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;YES →&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A1&lt;/td&gt;
&lt;td&gt;Read on &lt;strong&gt;every request&lt;/strong&gt; (or &amp;gt;100/sec per process)?&lt;/td&gt;
&lt;td&gt;Hot path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2&lt;/td&gt;
&lt;td&gt;Read inside &lt;strong&gt;authorization, fraud, rate limit, or circuit&lt;/strong&gt; gate?&lt;/td&gt;
&lt;td&gt;Hot path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A3&lt;/td&gt;
&lt;td&gt;Read in &lt;strong&gt;tight loop&lt;/strong&gt; (streaming, inference batching)?&lt;/td&gt;
&lt;td&gt;Hot path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A4&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Java or Python&lt;/strong&gt; only (Kiponos SDK scope)?&lt;/td&gt;
&lt;td&gt;Eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Section B — Change pattern
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;YES →&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;td&gt;Changed during &lt;strong&gt;incidents&lt;/strong&gt; or peaks?&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Changed in &lt;strong&gt;seconds&lt;/strong&gt;, not PR + deploy?&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Owned by &lt;strong&gt;SRE / fraud / FinOps&lt;/strong&gt;, not platform quarterly?&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;Must &lt;strong&gt;multiple services&lt;/strong&gt; see the same value quickly?&lt;/td&gt;
&lt;td&gt;Live tree&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Section C — Disqualifiers (do NOT put in Kiponos)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;YES → use other tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C1&lt;/td&gt;
&lt;td&gt;Secret (password, API key)?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vault&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;td&gt;Infrastructure topology (replicas, CRDs)?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C3&lt;/td&gt;
&lt;td&gt;User cohort experiment?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Feature flags&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C4&lt;/td&gt;
&lt;td&gt;Immutable legal/audit record?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Compliance store&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C5&lt;/td&gt;
&lt;td&gt;Service stack is not Java or Python?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Java/Python path&lt;/strong&gt; or wait — not Kiponos SDK today&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Admit to Kiponos when:&lt;/strong&gt; A1–A4 and B1–B4 score YES, and C1–C5 are NO.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn4jqw0l6e451cpyz3txv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn4jqw0l6e451cpyz3txv.png" alt="Architecture diagram" width="800" height="754"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Worked example — &lt;code&gt;permits_per_second&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A1 Read per request?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;YES&lt;/strong&gt; — rate limiter on every API call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2 Security gate?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;YES&lt;/strong&gt; — abuse protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B1 Incident change?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;YES&lt;/strong&gt; — DDoS throttle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2 Seconds latency?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;YES&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C1 Secret?&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2 Infra?&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verdict&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Kiponos&lt;/strong&gt; — &lt;code&gt;limits/api/permits_per_second&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Worked example — &lt;code&gt;server.port&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A1 Per request?&lt;/td&gt;
&lt;td&gt;NO — bind at startup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B1 Incident?&lt;/td&gt;
&lt;td&gt;NO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2 Infra?&lt;/td&gt;
&lt;td&gt;Borderline — &lt;strong&gt;bootstrap YAML&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verdict&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;application.yml&lt;/strong&gt; / GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Config tree — admitted keys for new microservice
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;limits/&lt;/span&gt;
  &lt;span class="s"&gt;api/&lt;/span&gt;
    &lt;span class="s"&gt;permits_per_second&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;
    &lt;span class="na"&gt;burst&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
&lt;span class="s"&gt;fraud/&lt;/span&gt;
  &lt;span class="s"&gt;thresholds/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
    &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;67&lt;/span&gt;
&lt;span class="s"&gt;resilience/&lt;/span&gt;
  &lt;span class="s"&gt;upstream_catalog/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;
    &lt;span class="na"&gt;max_retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="s"&gt;checklist/&lt;/span&gt;
  &lt;span class="s"&gt;admitted_at&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-07-08"&lt;/span&gt;
  &lt;span class="na"&gt;reviewer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-architecture&lt;/span&gt;
  &lt;span class="na"&gt;rejected_to_gitops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server.port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;replicaCount"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['platform']['prod']['checklist']&lt;/code&gt; or per-service &lt;code&gt;['catalog']['api']['prod']['live']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — checklist-approved wiring
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RateLimitedApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;RateLimiter&lt;/span&gt; &lt;span class="n"&gt;limiter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RateLimitedApi&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RateLimiter&lt;/span&gt; &lt;span class="n"&gt;limiter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;limiter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;afterValueChanged&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"permits_per_second"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;limiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"limits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"api"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"permits_per_second"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt; &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"limits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"api"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"permits_per_second"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;limiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryAcquire&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;permits&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tooManyRequests&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;businessLogic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;catalog&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;block_score&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fraud&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;thresholds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real scenarios — checklist outcomes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Checklist verdict&lt;/th&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;permits_per_second&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hot + incident&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hot + fraud&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replicaCount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C2 infra&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db_password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C1 secret&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vault&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;new_ui_for_5pct_users&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C3 cohort&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LaunchDarkly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server.port&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cold bootstrap&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;YAML&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saga.timeout_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;B4 cross-service&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance — why checklist matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constants&lt;/strong&gt; — zero read cost, infinite change cost (deploy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis poll 10s&lt;/strong&gt; — hot path sees stale &lt;code&gt;permits_per_second&lt;/code&gt; during DDoS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps PR&lt;/strong&gt; — minutes; checklist catches before wiring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiponos local read&lt;/strong&gt; — checklist-approved keys get microsecond lookup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binder hooks&lt;/strong&gt; — &lt;code&gt;afterValueChanged&lt;/code&gt; updates Resilience4j without restart&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Hot-path read&lt;/th&gt;
&lt;th&gt;Incident edit&lt;/th&gt;
&lt;th&gt;Checklist fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;static final&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fail&lt;/strong&gt; A+B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll&lt;/td&gt;
&lt;td&gt;Poll staleness&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fail&lt;/strong&gt; B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitOps YAML&lt;/td&gt;
&lt;td&gt;Static until deploy&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fail&lt;/strong&gt; B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags&lt;/td&gt;
&lt;td&gt;Network eval&lt;/td&gt;
&lt;td&gt;Wrong semantics&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fail&lt;/strong&gt; C3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Local get*()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pass&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checklist result&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C1 secret&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C2 infra&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C3 cohort&lt;/td&gt;
&lt;td&gt;Feature flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C4 immutable record&lt;/td&gt;
&lt;td&gt;Compliance workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C5 non Java/Python&lt;/td&gt;
&lt;td&gt;Document gap; do not fake SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold path bootstrap&lt;/td&gt;
&lt;td&gt;YAML OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy checklist sections A, B, C into design review template.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;TeamPro at kiponos.io&lt;/a&gt; — create service profile &lt;code&gt;['your-service']['prod']['live']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run checklist on first five proposed keys.&lt;/li&gt;
&lt;li&gt;Wire admitted keys only — reject &lt;code&gt;permits_per_second&lt;/code&gt; in YAML.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;checklist/admitted_at&lt;/code&gt; metadata key in tree for audit.&lt;/li&gt;
&lt;li&gt;PR policy: no hot-path constant merges without architect sign-off.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-ops-knob-taxonomy.md" rel="noopener noreferrer"&gt;Ops knob taxonomy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-when-gitops-when-live-config.md" rel="noopener noreferrer"&gt;When GitOps, when live config checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — run the checklist once at design review; skip the bridge debate on every incident afterward.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DIY Consul/etcd Config — When to Stop Building (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 12:31:14 +0000</pubDate>
      <link>https://dev.to/kiponos/diy-consuletcd-config-when-to-stop-building-architecture-5dh0</link>
      <guid>https://dev.to/kiponos/diy-consuletcd-config-when-to-stop-building-architecture-5dh0</guid>
      <description>&lt;p&gt;Black Friday retrospective. Platform built &lt;strong&gt;live config on Consul KV&lt;/strong&gt; three years ago. Every service watches &lt;code&gt;config/payments/prod/fraud/block_score&lt;/code&gt;. It worked — until catalog pods &lt;strong&gt;hammered Consul&lt;/strong&gt; with long-poll watchers, JVM services added &lt;strong&gt;30s local cache TTL&lt;/strong&gt; "to be safe," and fraud raised &lt;code&gt;block_score&lt;/code&gt; in KV while authorization still read &lt;strong&gt;stale 88&lt;/strong&gt; for half a minute.&lt;/p&gt;

&lt;p&gt;The infra lead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We are not bad engineers. We are &lt;strong&gt;product engineers for a config product&lt;/strong&gt; we never meant to build. When do we &lt;strong&gt;stop&lt;/strong&gt; DIY and adopt a hub whose only job is live config?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This buyer guide is the &lt;strong&gt;stop line&lt;/strong&gt; companion to &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-vs-consul-etcd.md" rel="noopener noreferrer"&gt;Kiponos vs Consul/etcd&lt;/a&gt;. &lt;a href="https://www.consul.io/" rel="noopener noreferrer"&gt;Consul&lt;/a&gt; and &lt;a href="https://etcd.io/" rel="noopener noreferrer"&gt;etcd&lt;/a&gt; remain excellent for &lt;strong&gt;service discovery and coordination&lt;/strong&gt;. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; replaces the &lt;strong&gt;DIY config layer&lt;/strong&gt; teams bolt on top — dashboards, schemas, watch loops, cache coherency debates. Evaluate during &lt;strong&gt;Black Friday stale KV — evaluate hub vs DIY&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — KV watch is not a product
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Scheduled&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixedDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;refreshConfig&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;consulClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKVValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"config/payments/fraud/block_score"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blockScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base64Decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// may be 30s stale with cache layered on&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teams building on KV inherit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key naming conventions that diverge per service&lt;/li&gt;
&lt;li&gt;Custom dashboards or raw &lt;code&gt;consulctl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Schema validation gaps — strings in KV&lt;/li&gt;
&lt;li&gt;Cache coherency wars — TTL vs watch vs dual-write&lt;/li&gt;
&lt;li&gt;Watch storms under churn — Black Friday catalog nightmare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost is not Consul licensing. It is &lt;strong&gt;headcount operating a config product on coordination primitives&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Consul watch is real-time"&lt;/td&gt;
&lt;td&gt;Watch storms → teams add &lt;strong&gt;TTL cache&lt;/strong&gt; → staleness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We already run Consul for mesh"&lt;/td&gt;
&lt;td&gt;Repurposing SD &lt;strong&gt;couples&lt;/strong&gt; discovery outages to config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"KV is free self-hosted"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Engineering tax&lt;/strong&gt; for dashboard, ACL, schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"30s cache is safe"&lt;/td&gt;
&lt;td&gt;Fraud raised score; auth read &lt;strong&gt;stale 88&lt;/strong&gt; — revenue loss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We are almost done with the platform"&lt;/td&gt;
&lt;td&gt;Config platforms are &lt;strong&gt;never finished&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Consul coordinates infrastructure. A live config hub operates application behavior.&lt;/strong&gt; Keep Consul for service catalog. Move operational thresholds to a purpose-built hub with WebSocket deltas and local SDK reads — stop paying the DIY tax when the stop-line signals fire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop-line checklist — when to stop building DIY
&lt;/h2&gt;

&lt;p&gt;Stop extending DIY Consul/etcd config when &lt;strong&gt;three or more&lt;/strong&gt; apply:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Stop signal&lt;/th&gt;
&lt;th&gt;What it costs you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;You added &lt;strong&gt;local TTL cache&lt;/strong&gt; because watches hammered KV&lt;/td&gt;
&lt;td&gt;Staleness bugs on hot path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Two teams&lt;/strong&gt; invented incompatible key hierarchies&lt;/td&gt;
&lt;td&gt;Onboarding tax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;On-call runbook includes &lt;strong&gt;"restart watchers"&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Reliability debt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Fraud/SRE needs &lt;strong&gt;sub-minute&lt;/strong&gt; edits during incidents&lt;/td&gt;
&lt;td&gt;KV + cache too slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;You built a &lt;strong&gt;custom dashboard&lt;/strong&gt; for non-engineers&lt;/td&gt;
&lt;td&gt;Permanent maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Java and Python&lt;/strong&gt; duplicate watch boilerplate&lt;/td&gt;
&lt;td&gt;Polyglot tax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Postmortem cites &lt;strong&gt;stale config&lt;/strong&gt; as contributing factor&lt;/td&gt;
&lt;td&gt;Business risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Platform roadmap has &lt;strong&gt;"config v2"&lt;/strong&gt; for third year&lt;/td&gt;
&lt;td&gt;Opportunity cost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three or more → evaluate &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; for ops keys; keep Consul for SD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture — DIY watch vs hub delta
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50vbhczhgaksl063ls5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F50vbhczhgaksl063ls5m.png" alt="Architecture diagram" width="582" height="1938"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision table — keep Consul vs migrate ops keys
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Keep on Consul/etcd&lt;/th&gt;
&lt;th&gt;Migrate to Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service registration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health checks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leader election / locks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraud.block_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saga timeout trees&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-tenant RPM limits&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bootstrap service name&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML &lt;code&gt;batch_size&lt;/code&gt; on worker&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Config tree — replace slash-separated KV
&lt;/h2&gt;

&lt;p&gt;Consul today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/payments/prod/fraud/thresholds/block_score = 82
config/payments/prod/saga/inventory/timeout_ms = 45000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kiponos tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;payments_ops/&lt;/span&gt;
  &lt;span class="s"&gt;fraud/&lt;/span&gt;
    &lt;span class="s"&gt;thresholds/&lt;/span&gt;
      &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
      &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;67&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;resilience/&lt;/span&gt;
    &lt;span class="s"&gt;partner/&lt;/span&gt;
      &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;38&lt;/span&gt;
  &lt;span class="s"&gt;saga/&lt;/span&gt;
    &lt;span class="s"&gt;inventory_compensation/&lt;/span&gt;
      &lt;span class="s"&gt;timeout_ms&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45000&lt;/span&gt;
      &lt;span class="na"&gt;max_retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;limits/&lt;/span&gt;
    &lt;span class="s"&gt;tenant_acme/&lt;/span&gt;
      &lt;span class="s"&gt;rpm&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration — delete the scheduled Consul poll
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KiponosConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="nf"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.team-id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.access-key}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;profilePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"['payments']['prod']['live']"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FraudGate&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payments_ops"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;inventory_compensation_timeout_ms&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments_ops&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;saga&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;inventory_compensation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeout_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;consul watch&lt;/code&gt; sidecar beside Celery workers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios — DIY pain vs hub
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;DIY Consul KV&lt;/th&gt;
&lt;th&gt;Kiponos hub&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Black Friday stale KV&lt;/td&gt;
&lt;td&gt;30s cache lie on &lt;code&gt;block_score&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Delta; next &lt;code&gt;getInt()&lt;/code&gt; immediate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raise fraud score mid-incident&lt;/td&gt;
&lt;td&gt;KV put; caches stale&lt;/td&gt;
&lt;td&gt;Dashboard seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consul outage during peak&lt;/td&gt;
&lt;td&gt;Reads fail or stale&lt;/td&gt;
&lt;td&gt;SDK serves last merged tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New engineer onboards&lt;/td&gt;
&lt;td&gt;Key conventions + watchers&lt;/td&gt;
&lt;td&gt;Dashboard + &lt;code&gt;path()&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-service saga timeout&lt;/td&gt;
&lt;td&gt;Six flat keys to grep&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;payments_ops/saga/*&lt;/code&gt; tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service discovery refresh&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Consul native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not Kiponos job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance — watch storms vs local read
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consul long-poll&lt;/strong&gt; — server load scales with watcher count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DIY TTL cache&lt;/strong&gt; — trades staleness for load — the Black Friday bug&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;etcd gRPC watch&lt;/strong&gt; — better streams; still not in-process &lt;code&gt;getInt()&lt;/code&gt; without cache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiponos delta&lt;/strong&gt; — one key patch; no per-service watcher fleet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read path&lt;/strong&gt; — O(1) SDK memory beside authorization logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;DIY Consul/etcd KV&lt;/th&gt;
&lt;th&gt;Kiponos&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service discovery&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not replacement&lt;/td&gt;
&lt;td&gt;Keep Consul&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DIY config on KV&lt;/td&gt;
&lt;td&gt;Flexible, &lt;strong&gt;you operate&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Managed hub&lt;/td&gt;
&lt;td&gt;Stop DIY when checklist hits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot-path local read&lt;/td&gt;
&lt;td&gt;RTT unless cached (stale)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typed tree + dashboard&lt;/td&gt;
&lt;td&gt;Build yourself&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Built-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational headcount&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;TCO at stop line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Better tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service registration and health&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Consul&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distributed locks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;etcd&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mesh certificate rotation&lt;/td&gt;
&lt;td&gt;Consul / Istio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure desired state&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Air-gap mandate to self-host KV only&lt;/td&gt;
&lt;td&gt;Evaluate private hub deploy vs DIY&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes) — evaluate at stop line
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run stop-line checklist — count signals ≥ 3.&lt;/li&gt;
&lt;li&gt;Inventory Consul keys under &lt;code&gt;config/*&lt;/code&gt; — mark &lt;strong&gt;ops&lt;/strong&gt; vs &lt;strong&gt;bootstrap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;TeamPro at kiponos.io&lt;/a&gt; — profile &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Migrate &lt;strong&gt;three keys&lt;/strong&gt;: &lt;code&gt;block_score&lt;/code&gt;, one saga timeout, one tenant RPM.&lt;/li&gt;
&lt;li&gt;Delete &lt;code&gt;@Scheduled&lt;/code&gt; Consul poll in one service; measure hot-path latency.&lt;/li&gt;
&lt;li&gt;Leave Consul &lt;strong&gt;service catalog&lt;/strong&gt; untouched — config migration only.&lt;/li&gt;
&lt;li&gt;Present TCO slide: DIY dashboard + on-call hours vs hub subscription.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-vs-consul-etcd.md" rel="noopener noreferrer"&gt;Kiponos vs Consul/etcd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-anti-diy-consul-watch.md" rel="noopener noreferrer"&gt;Anti-pattern: DIY Consul watch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — Consul for where services live. Stop building the config product on top when stale cache writes your postmortem.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>When GitOps, When Live Config — Buyer Checklist (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 10:14:16 +0000</pubDate>
      <link>https://dev.to/kiponos/when-gitops-when-live-config-buyer-checklist-architecture-2k4i</link>
      <guid>https://dev.to/kiponos/when-gitops-when-live-config-buyer-checklist-architecture-2k4i</guid>
      <description>&lt;p&gt;Quarterly platform review. The whiteboard shows &lt;strong&gt;four overlapping boxes&lt;/strong&gt;: Argo CD, Spring Cloud Config, a feature-flag SaaS, and a Redis hash "for operational floats." Every incident reopens the same argument — &lt;strong&gt;which box owns the knob&lt;/strong&gt; that just caught fire.&lt;/p&gt;

&lt;p&gt;The new platform lead asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We have GitOps. Why do we also need live config? Give me a &lt;strong&gt;checklist&lt;/strong&gt; I can run on every new key before we drown in tools."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article is the &lt;strong&gt;buyer-facing companion&lt;/strong&gt; to &lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-when-gitops-when-live-config.md" rel="noopener noreferrer"&gt;When GitOps, when live config, when feature flags&lt;/a&gt;. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; owns the &lt;strong&gt;operational lane&lt;/strong&gt; — nested trees, WebSocket deltas, local Java and Python reads. GitOps owns &lt;strong&gt;desired state&lt;/strong&gt;. Feature flags own &lt;strong&gt;cohorts&lt;/strong&gt;. Use this checklist during &lt;strong&gt;quarterly review — classify new keys before tooling&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — config sprawl without classification
&lt;/h2&gt;

&lt;p&gt;Without explicit boundaries, teams default to whichever tool was purchased first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# values-prod.yaml — mixed classes (anti-pattern)&lt;/span&gt;
&lt;span class="na"&gt;replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;
&lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;
&lt;span class="na"&gt;resilience4j&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;circuitbreaker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;payments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;failureRateThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;   &lt;span class="c1"&gt;# operational — wrong home&lt;/span&gt;
&lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;newCheckout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;                &lt;span class="c1"&gt;# product — debatable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;FAILURE_RATE_THRESHOLD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Incident at 14:00: fraud needs &lt;code&gt;block_score&lt;/code&gt; 90 → 82. Someone opens a GitOps PR. Product wants checkout canary 5% → 10%. Platform rotates TLS via cert-manager. &lt;strong&gt;Three tools, three latencies, one bridge.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"GitOps covers all config"&lt;/td&gt;
&lt;td&gt;Git reconciles &lt;strong&gt;desired state&lt;/strong&gt;, not sub-minute ops knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"ConfigMaps are live enough"&lt;/td&gt;
&lt;td&gt;Mount sync + rollout = &lt;strong&gt;minutes&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Flags hold floats"&lt;/td&gt;
&lt;td&gt;Fraud thresholds are not &lt;strong&gt;cohort experiments&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"One more Redis layer unifies"&lt;/td&gt;
&lt;td&gt;Fourth system without dashboard ACL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Diagrams in Confluence fix sprawl"&lt;/td&gt;
&lt;td&gt;Without &lt;strong&gt;per-key classification&lt;/strong&gt;, sprawl returns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Assign every key to a config class before assigning a tool.&lt;/strong&gt; GitOps reconciles cluster topology. Feature flags decide user-visible experiments. Kiponos holds operational floats every service reads locally — thresholds, limits, timeouts, saga coordination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buyer checklist — seven questions per new key
&lt;/h2&gt;

&lt;p&gt;Run this on every proposed configuration key:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;If YES →&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Does it declare &lt;strong&gt;infrastructure topology&lt;/strong&gt; (replicas, CRDs, IAM)?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Is it a &lt;strong&gt;secret&lt;/strong&gt; (password, API key, signing key)?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vault&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Does it target &lt;strong&gt;user cohorts&lt;/strong&gt; for product experiments?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Feature flags&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Does it change because of &lt;strong&gt;production behavior&lt;/strong&gt; (incident, load, fraud)?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Live config (Kiponos)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Is it read on a &lt;strong&gt;hot path&lt;/strong&gt; thousands of times per second?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Live config&lt;/strong&gt; — local read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Is change latency requirement &lt;strong&gt;seconds&lt;/strong&gt;, not PR + reconcile?&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Live config&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Is it a &lt;strong&gt;one-time bootstrap default&lt;/strong&gt; reviewed quarterly?&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;GitOps&lt;/strong&gt; or static YAML OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If questions 4–6 are YES and 1–3 are NO → &lt;strong&gt;Kiponos&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture — three lanes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbmw31t7l8079ygojg3w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbmw31t7l8079ygojg3w8.png" alt="Architecture diagram" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision matrix — expanded buyer table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key example&lt;/th&gt;
&lt;th&gt;Lane&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Change latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replicaCount: 12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Helm + Argo&lt;/td&gt;
&lt;td&gt;PR + reconcile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ingress.host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Kustomize&lt;/td&gt;
&lt;td&gt;PR + reconcile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraud.block_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failure_rate_threshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hikari.maximum_pool_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds + binder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saga.inventory.timeout_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;new_checkout for 5% EU users&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LaunchDarkly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Experiment cadence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ml.embedding.batch_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live ops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS certificate&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;cert-manager&lt;/td&gt;
&lt;td&gt;Automated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API keys&lt;/td&gt;
&lt;td&gt;Secrets&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;td&gt;Rotation policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KIPONOS_PROFILE&lt;/code&gt; bootstrap&lt;/td&gt;
&lt;td&gt;GitOps + secret&lt;/td&gt;
&lt;td&gt;Helm + Vault&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Profile path for operational lane: &lt;code&gt;['platform']['prod']['lanes']&lt;/code&gt; — or per-service &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree — operational lane example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;payments_ops/&lt;/span&gt;
  &lt;span class="s"&gt;fraud/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;82&lt;/span&gt;
    &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;68&lt;/span&gt;
    &lt;span class="na"&gt;velocity_per_hour&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;resilience/&lt;/span&gt;
    &lt;span class="s"&gt;payments/&lt;/span&gt;
      &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;
      &lt;span class="na"&gt;wait_duration_open_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25000&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s"&gt;limits/&lt;/span&gt;
    &lt;span class="s"&gt;tenant_acme/&lt;/span&gt;
      &lt;span class="s"&gt;rpm&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7000&lt;/span&gt;
  &lt;span class="s"&gt;saga/&lt;/span&gt;
    &lt;span class="s"&gt;inventory/&lt;/span&gt;
      &lt;span class="s"&gt;compensation_timeout_ms&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40000&lt;/span&gt;
  &lt;span class="s"&gt;ml/&lt;/span&gt;
    &lt;span class="s"&gt;routing/&lt;/span&gt;
      &lt;span class="s"&gt;batch_size&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
&lt;span class="s"&gt;classification/&lt;/span&gt;
  &lt;span class="s"&gt;last_review_quarter&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-Q2"&lt;/span&gt;
  &lt;span class="na"&gt;keys_migrated_from_gitops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitOps &lt;code&gt;values-prod.yaml&lt;/code&gt; retains only bootstrap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;kiponos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;profilePath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;['payments']['prod']['live']"&lt;/span&gt;
&lt;span class="c1"&gt;# resilience4j floats REMOVED — live in hub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — operational lane wiring
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KiponosConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="nf"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.team-id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.access-key}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@Value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${kiponos.profile-path}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;profilePath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;teamId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;profilePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profilePath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LaneAwarePayments&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payments_ops"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payments_ops"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"resilience"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payments"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFloat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"failure_rate_threshold"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downstreamUnhealthy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;degrade&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;approve&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;batch_size&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payments_ops&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;ml&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;routing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;batch_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real scenarios — checklist in action
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Wrong lane&lt;/th&gt;
&lt;th&gt;Right lane&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scale Deployment 10 → 20&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIN attack — lower block score&lt;/td&gt;
&lt;td&gt;GitOps PR (27 min)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Kiponos&lt;/strong&gt; (seconds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5% checkout UI canary for EU&lt;/td&gt;
&lt;td&gt;Kiponos bool without targeting&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LaunchDarkly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add Redis StatefulSet&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saga timeout during partner outage&lt;/td&gt;
&lt;td&gt;ConfigMap rollout&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rotate DB password&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vault&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New key: &lt;code&gt;permits_per_second&lt;/code&gt; on API&lt;/td&gt;
&lt;td&gt;Run checklist Q4–6 → YES&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance — why lane separation matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitOps reconcile&lt;/strong&gt; — correct for infra; wrong for per-request floats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature-flag evaluation&lt;/strong&gt; — user context at 12k TPS for &lt;code&gt;block_score&lt;/code&gt; is expensive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiponos read&lt;/strong&gt; — local cache; microsecond-scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ConfigMap volume&lt;/strong&gt; — sync delay; restart culture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checklist prevents fourth Redis layer&lt;/strong&gt; — sprawl has real latency cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;GitOps&lt;/th&gt;
&lt;th&gt;Kiponos&lt;/th&gt;
&lt;th&gt;Feature flags&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Declarative infra&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-second incident knob&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Poor fit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User cohort targeting&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;App logic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested ops trees&lt;/td&gt;
&lt;td&gt;YAML in Git&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON hacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot-path local read&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network eval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit via Git blame&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hub log&lt;/td&gt;
&lt;td&gt;Experiment history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Lane&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New microservice Deployment&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Argo CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cert-manager Certificate&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multivariate UI experiment&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;LaunchDarkly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quarterly default wiring&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;td&gt;Git PR OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immutable compliance record&lt;/td&gt;
&lt;td&gt;Legal&lt;/td&gt;
&lt;td&gt;Wiki + workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes) — run the checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Export keys from Helm, Config Server, flags, code constants.&lt;/li&gt;
&lt;li&gt;Tag each: &lt;strong&gt;gitops&lt;/strong&gt; | &lt;strong&gt;live_ops&lt;/strong&gt; | &lt;strong&gt;product_flag&lt;/strong&gt; | &lt;strong&gt;secret&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;TeamPro at kiponos.io&lt;/a&gt; — profile &lt;code&gt;['payments']['prod']['live']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Migrate &lt;strong&gt;five highest-churn live_ops keys&lt;/strong&gt; first.&lt;/li&gt;
&lt;li&gt;Publish internal doc: &lt;em&gt;"Git declares wiring; hub declares knobs; flags declare cohorts."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Add checklist to PR template for any new &lt;code&gt;values-prod.yaml&lt;/code&gt; key.&lt;/li&gt;
&lt;li&gt;Game day: fraud spike — measure GitOps PR path vs hub path.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-when-gitops-when-live-config.md" rel="noopener noreferrer"&gt;When GitOps, when live config (framework)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-buy-guide-hot-path-config-checklist.md" rel="noopener noreferrer"&gt;Hot-path config checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — GitOps for what you deploy. Flags for who sees it. The hub for how it runs when the bridge is loud.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>When Statsig, When Kiponos — Product Experiments vs Ops Thresholds (Architecture)</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 12 Jul 2026 07:57:11 +0000</pubDate>
      <link>https://dev.to/kiponos/when-statsig-when-kiponos-product-experiments-vs-ops-thresholds-architecture-10o4</link>
      <guid>https://dev.to/kiponos/when-statsig-when-kiponos-product-experiments-vs-ops-thresholds-architecture-10o4</guid>
      <description>&lt;p&gt;Product platform standup. Growth celebrates a &lt;strong&gt;checkout experiment&lt;/strong&gt; — Statsig gate &lt;code&gt;new_payment_sheet&lt;/code&gt;, 8% EU exposure, funnel metrics wired. Payments SRE reports processor latency: need &lt;code&gt;failure_rate_threshold&lt;/code&gt; at 28 and &lt;code&gt;fraud.block_score&lt;/code&gt; at 79 before GPUs OOM on the embedding worker.&lt;/p&gt;

&lt;p&gt;The growth lead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Statsig has &lt;strong&gt;dynamic config&lt;/strong&gt;. Put &lt;code&gt;block_score&lt;/code&gt; in a config parameter — one SDK, one dashboard."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The principal engineer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Statsig decides &lt;strong&gt;which users see which product&lt;/strong&gt;. Our auth path runs &lt;strong&gt;14k evaluations per second&lt;/strong&gt; for floats that change during incidents — not cohort bucketing with exposure logging."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://statsig.com" rel="noopener noreferrer"&gt;Statsig&lt;/a&gt; excels at &lt;strong&gt;gates, experiments, and product analytics&lt;/strong&gt;. &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; excels at &lt;strong&gt;fraud thresholds, circuit breakers, and pool sizes&lt;/strong&gt; with local &lt;code&gt;get*()&lt;/code&gt; on money paths. This buyer guide answers &lt;strong&gt;PM wants flag for block_score — redirect to ops tree&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem — experiment infrastructure on the authorization hot path
&lt;/h2&gt;

&lt;p&gt;Correct Statsig usage — product gate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;StatsigUser&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StatsigUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setUserID&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;showNewSheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statsig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkGate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"new_payment_sheet"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anti-pattern — ops float in experiment config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;DynamicConfig&lt;/span&gt; &lt;span class="n"&gt;resilience&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statsig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"resilience_tuning"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resilience&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;blockScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User context required&lt;/strong&gt; for system-bound thresholds — fake system users smell&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposure logging&lt;/strong&gt; optimized for product analytics — overhead at 14k TPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Namespace collision&lt;/strong&gt; — PM experiments and SRE incident keys in one console&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python workers + Java APIs&lt;/strong&gt; — duplicate dynamic config or custom sync&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What teams believe vs production reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production reality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Statsig dynamic config replaces a config hub"&lt;/td&gt;
&lt;td&gt;Built for &lt;strong&gt;parameter experiments&lt;/strong&gt;, not nested ops trees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"One SDK simplifies architecture"&lt;/td&gt;
&lt;td&gt;Product and ops have &lt;strong&gt;different latency and ownership&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"block_score is just another config param"&lt;/td&gt;
&lt;td&gt;Fraud thresholds are &lt;strong&gt;incident knobs&lt;/strong&gt;, not cohort tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"We will namespace keys carefully"&lt;/td&gt;
&lt;td&gt;Without RFC, PMs still file tickets for &lt;code&gt;block_score&lt;/code&gt; gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Statsig + Redis for the rest"&lt;/td&gt;
&lt;td&gt;Three systems for one platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Statsig measures which product experiences win. Kiponos keeps production alive when processors degrade.&lt;/strong&gt; Keep &lt;code&gt;new_payment_sheet&lt;/code&gt; in Statsig with full experiment analytics. Move &lt;code&gt;block_score&lt;/code&gt;, &lt;code&gt;failure_rate_threshold&lt;/code&gt;, and &lt;code&gt;worker_pool_size&lt;/code&gt; to Kiponos — local reads, no per-transaction gate evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each platform owns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Statsig:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature gates with cohort targeting and exposure events&lt;/li&gt;
&lt;li&gt;A/B experiments tied to warehouse metrics&lt;/li&gt;
&lt;li&gt;Dynamic config for &lt;strong&gt;product-tunable&lt;/strong&gt; parameters (copy variants, default tabs)&lt;/li&gt;
&lt;li&gt;PM-owned release cadence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kiponos.io:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile &lt;code&gt;['payments']['api']['prod']['live']&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nested &lt;code&gt;fraud/thresholds/&lt;/code&gt;, &lt;code&gt;resilience/payments/&lt;/code&gt;, &lt;code&gt;ml/embedding/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;WebSocket delta → Java/Python SDK memory&lt;/li&gt;
&lt;li&gt;SRE / fraud / ML ops dashboard ACL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqertjrhxxz1prwktih9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqertjrhxxz1prwktih9.png" alt="Architecture diagram" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision table — Statsig vs Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key / behavior&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;new_payment_sheet&lt;/code&gt; gate for 8% EU users&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding copy A/B test&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fraud.block_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fraud ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failure_rate_threshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SRE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ml.embedding.worker_pool_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ML ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;checkout_button_color&lt;/code&gt; experiment&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Design / growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limits.partner_checkout.rpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partner ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional product bool in hub&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kiponos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;If consolidating SDK reads only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Boundary examples — hybrid Java service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckoutOrchestrator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CheckoutView&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;riskScore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Product plane — Statsig&lt;/span&gt;
        &lt;span class="nc"&gt;StatsigUser&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StatsigUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setUserID&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;newSheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Statsig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkGate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"new_payment_sheet"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Ops plane — Kiponos local read&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fraud"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"thresholds"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"block_score"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riskScore&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FraudBlockedException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;failThreshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"resilience"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payments"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFloat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"failure_rate_threshold"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processorUnhealthy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;failThreshold&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CheckoutView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;degraded&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newSheet&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CheckoutView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;normal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newSheet&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python embedding worker
&lt;/h3&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KIPONOS_PROFILE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;payments&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_for_current_team&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;worker_pool_size&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;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ml&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;embedding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;worker_pool_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Statsig not imported here — worker has no user cohort context
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Config tree — ops keys out of Statsig
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;fraud/&lt;/span&gt;
  &lt;span class="s"&gt;thresholds/&lt;/span&gt;
    &lt;span class="s"&gt;block_score&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;79&lt;/span&gt;
    &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;65&lt;/span&gt;
    &lt;span class="na"&gt;velocity_per_hour&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;
    &lt;span class="na"&gt;bin_attack_mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="s"&gt;resilience/&lt;/span&gt;
  &lt;span class="s"&gt;payments/&lt;/span&gt;
    &lt;span class="s"&gt;failure_rate_threshold&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;28&lt;/span&gt;
    &lt;span class="na"&gt;wait_duration_open_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22000&lt;/span&gt;
&lt;span class="s"&gt;ml/&lt;/span&gt;
  &lt;span class="s"&gt;embedding/&lt;/span&gt;
    &lt;span class="s"&gt;worker_pool_size&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;
    &lt;span class="na"&gt;batch_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;
    &lt;span class="na"&gt;oom_guard_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="s"&gt;statsig_bridge/&lt;/span&gt;
  &lt;span class="s"&gt;new_payment_sheet_gate&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;statsig_owned&lt;/span&gt;
  &lt;span class="s"&gt;onboarding_copy_experiment&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;statsig_owned&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Profile path: &lt;code&gt;['payments']['api']['prod']['live']&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Statsig alone&lt;/th&gt;
&lt;th&gt;Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PM wants &lt;code&gt;block_score&lt;/code&gt; gate for "experiment"&lt;/td&gt;
&lt;td&gt;Wrong semantics; needs fake users&lt;/td&gt;
&lt;td&gt;Redirect to &lt;code&gt;fraud/thresholds&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processor outage — lower circuit threshold&lt;/td&gt;
&lt;td&gt;Dynamic config poll + user context&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;getFloat()&lt;/code&gt; — seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8% checkout UI canary&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Statsig&lt;/strong&gt; — correct&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU OOM — shrink worker pool&lt;/td&gt;
&lt;td&gt;No user context on worker&lt;/td&gt;
&lt;td&gt;Live &lt;code&gt;worker_pool_size&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespace collision incident&lt;/td&gt;
&lt;td&gt;PM gate name shadows ops key&lt;/td&gt;
&lt;td&gt;Separate hubs by design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance — evaluation vs local read
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Statsig gate check&lt;/strong&gt; — network + user hashing + exposure event — fine for product paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14k auth TPS&lt;/strong&gt; — per-request dynamic config evaluation adds &lt;strong&gt;measurable CPU and IO&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiponos &lt;code&gt;getInt()&lt;/code&gt;&lt;/strong&gt; — in-process tree lookup — microseconds beside risk engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid checkout&lt;/strong&gt; — one Statsig gate per page + two Kiponos reads — clean separation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-runtime&lt;/strong&gt; — Java API and Python worker share Kiponos tree; Statsig duplicated per runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Statsig&lt;/th&gt;
&lt;th&gt;Kiponos&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cohort targeting + analytics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App logic only&lt;/td&gt;
&lt;td&gt;Statsig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident float during outage&lt;/td&gt;
&lt;td&gt;Poor fit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested fraud/resilience tree&lt;/td&gt;
&lt;td&gt;Flat namespaces&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot-path local read&lt;/td&gt;
&lt;td&gt;SDK network eval&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product experiment history&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Excellent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Statsig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java + Python ops sharing&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Both SDKs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kiponos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Use instead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multivariate UI experiment with funnel metrics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gate rollout 5% → 50% with exposure logging&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product copy dynamic config&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Statsig&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure replica counts&lt;/td&gt;
&lt;td&gt;GitOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets&lt;/td&gt;
&lt;td&gt;Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;List Statsig dynamic config keys — mark &lt;strong&gt;product&lt;/strong&gt; vs &lt;strong&gt;misplaced ops&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Migrate ops keys to Kiponos &lt;code&gt;['payments']['api']['prod']['live']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;statsig_bridge/&lt;/code&gt; documentation keys listing what stays on Statsig.&lt;/li&gt;
&lt;li&gt;Refactor authorization to &lt;code&gt;kiponos.path("fraud", "thresholds").getInt("block_score")&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;PM workflow: experiments file in Statsig; fraud tickets edit Kiponos — publish RACI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-vs-statsig.md" rel="noopener noreferrer"&gt;Kiponos vs Statsig (deep dive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-pattern-ops-knob-taxonomy.md" rel="noopener noreferrer"&gt;Ops knob taxonomy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Kiponos.io — Statsig learns what users prefer. The hub keeps authorization thresholds honest at 14k TPS.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
