<?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: Alpha Info</title>
    <description>The latest articles on DEV Community by Alpha Info (@alpha_info).</description>
    <link>https://dev.to/alpha_info</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3898490%2F230d1fe1-7770-438b-907a-9140a14397e4.png</url>
      <title>DEV Community: Alpha Info</title>
      <link>https://dev.to/alpha_info</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alpha_info"/>
    <language>en</language>
    <item>
      <title>Building self-correcting time-series analysis for Claude Code: 50% 100% accuracy with no manual config</title>
      <dc:creator>Alpha Info</dc:creator>
      <pubDate>Sun, 26 Apr 2026 08:29:18 +0000</pubDate>
      <link>https://dev.to/alpha_info/building-self-correcting-time-series-analysis-for-claude-code-50-100-accuracy-with-no-manual-5bdb</link>
      <guid>https://dev.to/alpha_info/building-self-correcting-time-series-analysis-for-claude-code-50-100-accuracy-with-no-manual-5bdb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: I built a &lt;a href="https://github.com/info-dev-13/alphainfo-claude-skill" rel="noopener noreferrer"&gt;Claude Code skill&lt;/a&gt; that gives Claude structural eyes for time-series. The interesting bits: (1) it auto-tunes its own configuration via leave-one-out cross-validation (50% → 100% on real PhysioNet ECG), and (2) when the first call returns borderline, the skill self-corrects with a 4-stage cascade (alt-domain → fingerprint dim inspection → sliding-window escalation). Validated across 30 use cases on real and shape-realistic data. Free tier, MIT licensed, one-line install.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem nobody talks about
&lt;/h2&gt;

&lt;p&gt;Most LLM agents fail silently on time-series.&lt;/p&gt;

&lt;p&gt;Ask Claude "is this CSV column anomalous?" and it'll happily write a &lt;code&gt;scipy.stats.zscore&lt;/code&gt; or &lt;code&gt;numpy&lt;/code&gt; rolling-mean check. The code runs. The answer comes back. &lt;strong&gt;But the methodology is fragile&lt;/strong&gt;: Z-score detects mean shifts, not regime changes. Rolling means smear short events. Both miss when the &lt;em&gt;structure&lt;/em&gt; of a signal changes — same mean, same variance, different shape.&lt;/p&gt;

&lt;p&gt;This is the LLM-as-data-scientist gap. The model picks the easiest tool, not the right one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/info-dev-13/alphainfo-claude-skill" rel="noopener noreferrer"&gt;AlphaInfo for Claude&lt;/a&gt; is a Claude Code skill that wires the &lt;a href="https://www.alphainfo.io" rel="noopener noreferrer"&gt;AlphaInfo Structural Intelligence API&lt;/a&gt; into Claude conversations. The API perceives signal &lt;em&gt;structure&lt;/em&gt; (5-D fingerprint: local/fractal/spectral/transition/trend dimensions). The skill teaches Claude when and how to reach for it.&lt;/p&gt;

&lt;p&gt;A typical interaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "I have CPU metrics from yesterday — anything weird?"

Claude: [calls quick_anomaly()]
         "Critical anomaly detected at 14:00, severity 75/100. The sustained
          spike pattern differs structurally from your normal diurnal cycle.
          Audit ID: 5533a276-... (replayable for compliance)."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One HTTP call. Calibrated severity. Audit trail. No statistical code generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interesting part #1: smart_anomaly() is a 4-stage self-correcting cascade
&lt;/h2&gt;

&lt;p&gt;Most "AI tooling" fails because the AI picks the wrong knob and doesn't know it. So I built a cascade that &lt;strong&gt;detects borderline results and auto-escalates&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;lib.autotune&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;smart_anomaly&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;smart_anomaly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Quick check&lt;/strong&gt; (1 quota). If &lt;code&gt;severity &amp;gt; 65&lt;/code&gt; → done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative domains&lt;/strong&gt; (3 quota). API has 10 domain calibrations (&lt;code&gt;finance&lt;/code&gt;, &lt;code&gt;biomedical&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, etc.). If user picked wrong, try alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprint dim inspection&lt;/strong&gt; (1 quota). If scalar score is borderline, look at the 5-D fingerprint. Sometimes ONE dimension dropped sharply (e.g., &lt;code&gt;sim_transition=0.48&lt;/code&gt; for added harmonics) while the scalar averaged it out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sliding-window escalation&lt;/strong&gt; (5-10 quota). For localized regime changes, the global view misses them but a window-by-window comparison nails the boundary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The cascade pays only for what's needed.&lt;/strong&gt; A clean anomaly costs 1 quota. A subtle bearing-wear case (which I'll show below) goes through all 4 stages for 11 quota.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validated lifts
&lt;/h3&gt;

&lt;p&gt;I ran this against intentionally hard cases:&lt;/p&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;Naive single call&lt;/th&gt;
&lt;th&gt;After cascade&lt;/th&gt;
&lt;th&gt;Method that won&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;k8s pod restart spike&lt;/td&gt;
&lt;td&gt;sev 42 (attention)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;sev 92 critical&lt;/strong&gt; + window 115-145&lt;/td&gt;
&lt;td&gt;Stage 4 (monitor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bearing wear (pure spectral, stationary)&lt;/td&gt;
&lt;td&gt;sev 20 (normal)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;sev 67 alert&lt;/strong&gt; + "sharp transitions" diagnosis&lt;/td&gt;
&lt;td&gt;Stage 3 (fingerprint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Climate heat wave (60-day temp)&lt;/td&gt;
&lt;td&gt;sev 50 borderline&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;sev 75 alert&lt;/strong&gt; + window 15-45&lt;/td&gt;
&lt;td&gt;Stage 3+4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploy regression (latency +30%, same shape)&lt;/td&gt;
&lt;td&gt;sev 19 normal&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;sev 61 alert&lt;/strong&gt; + amplitude-shift warning&lt;/td&gt;
&lt;td&gt;Stage 3+4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bearing wear case is my favorite: a pure spectral change (added harmonics at same total energy) that any naive scalar comparison misses. The fingerprint inspection sees &lt;code&gt;sim_transition=0.48&lt;/code&gt; and produces a specific diagnosis: "sharp transitions / abrupt events / regime boundary."&lt;/p&gt;

&lt;p&gt;The skill &lt;em&gt;was perceiving the change the whole time&lt;/em&gt; — just not in the scalar score. Stage 3 unlocks it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interesting part #2: autotune_classifier hits 100% CV without manual config
&lt;/h2&gt;

&lt;p&gt;Classification with structural fingerprints is competitive with trained classifiers — IF you pick the right reference signal and classifier. For a long time, this was a manual tuning game.&lt;/p&gt;

&lt;p&gt;I tested on real PhysioNet MIT-BIH ECG record 208 (Normal vs PVC arrhythmia):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Naive setup&lt;/strong&gt; (sine reference + raw centroid distance): 50% accuracy (random)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual tuning&lt;/strong&gt; (mean-beat reference + LDA on standardized fingerprints): 95%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;autotune_classifier&lt;/code&gt;&lt;/strong&gt; (8-combo cross-validation): &lt;strong&gt;100% CV / 80% held-out, 24 quota total&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The auto-tuner enumerates &lt;code&gt;{reference: mean_class_0, median_class_0, sine} × {classifier: centroid_raw, centroid_norm, kNN, LDA}&lt;/code&gt; — that's 8 combinations. Scores each via leave-one-out CV on the training set. Picks the winner. Returns a &lt;code&gt;predict()&lt;/code&gt; closure ready to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;lib.autotune&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;autotune_classifier&lt;/span&gt;

&lt;span class="c1"&gt;# 8 N beats + 8 V beats from PhysioNet record 208
&lt;/span&gt;&lt;span class="n"&gt;labeled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;N&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;beat&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;n_beats&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;V&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;beat&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;v_beats&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;autotune_classifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labeled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;360.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;biomedical&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best_config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# {'reference_strategy': 'mean_class_0', 'classifier': 'lda_norm', 'normalize': True}
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cv_accuracy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# 1.0
&lt;/span&gt;
&lt;span class="c1"&gt;# Use the winner to classify a new beat
&lt;/span&gt;&lt;span class="n"&gt;prediction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;predict&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;new_beat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 'N' or 'V'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero domain expertise required from the user (or Claude). The skill found the right combo automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interesting part #3: plan-aware behavior
&lt;/h2&gt;

&lt;p&gt;The skill detects the user's API plan tier (&lt;code&gt;Free / Starter / Growth / Pro / Enterprise&lt;/code&gt;) on init and &lt;strong&gt;adapts every call&lt;/strong&gt; to fit the plan's caps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'name': 'Free', 'caps': {
#   'max_channels': 3, 'max_batch_size': 10,
#   'max_signal_length': 10_000, 'monthly_limit': 50, ...
# }, 'remaining': 47}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you ask the skill to do something larger than your plan allows, it auto-truncates and surfaces a &lt;strong&gt;contextual upgrade hint&lt;/strong&gt; instead of returning a surprise quota error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;multi_channel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;sensors&lt;/span&gt;&lt;span class="p"&gt;...},&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# On Free (3-channel cap), drops 5 channels, returns:
# {
#   'delator_channel': 'airflow',
#   'channels_dropped': 5,
#   'upgrade_hint': "Capped at 3 on Free. Starter ($49/mo) lifts to 8."
# }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the skill acting as a &lt;strong&gt;conversion funnel&lt;/strong&gt;: every limit hit is a contextual demo of what the next tier unlocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this validates
&lt;/h2&gt;

&lt;p&gt;I ran 30 real or shape-realistic use cases across 12 buyer segments. Key results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;Real-data validation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🐛 DevOps / SRE&lt;/td&gt;
&lt;td&gt;CPU spikes, memory leaks, multi-service faults — all critical sev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🤖 MLOps&lt;/td&gt;
&lt;td&gt;Model accuracy drift, feature covariate shift — alert sev 65-73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📈 Quant / Fintech&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Real yfinance&lt;/strong&gt;: SPY regime, BTC, VIX, Treasuries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🩺 Bio / Health&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Real PhysioNet ECG arrhythmia&lt;/strong&gt;: 100% CV via autotune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ Security / Protection&lt;/td&gt;
&lt;td&gt;Account takeover (sev 84), ransomware-pattern (sev 92), credential-stuffing (sev 96)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 SaaS / Product&lt;/td&gt;
&lt;td&gt;DAU drops, conversion funnel anomalies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏭 Industrial IoT&lt;/td&gt;
&lt;td&gt;Multi-sensor canal delator (which-of-N is failing)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus Audio, Climate, Gaming, Streaming, Logistics. Full matrix in &lt;a href="https://github.com/info-dev-13/alphainfo-claude-skill/blob/main/USE_CASES.md" rel="noopener noreferrer"&gt;USE_CASES.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;

&lt;p&gt;One-line install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/info-dev-13/alphainfo-claude-skill/main/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clones the skill into &lt;code&gt;~/.claude/skills/alphainfo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Installs the &lt;code&gt;alphainfo&lt;/code&gt; Python SDK&lt;/li&gt;
&lt;li&gt;Detects existing &lt;code&gt;ALPHAINFO_API_KEY&lt;/code&gt; — or opens the registration page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Free tier: &lt;strong&gt;50 analyses/month, no credit card&lt;/strong&gt;. Get a key at &lt;a href="https://www.alphainfo.io/register?ref=devto" rel="noopener noreferrer"&gt;alphainfo.io/register&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After install, just talk to Claude in any project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"is this CSV column anomalous?"
"compare this metric before and after deploy"
"which of my 8 sensors is misbehaving?"
"when did this stream change?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will route through the skill automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repo + links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/info-dev-13/alphainfo-claude-skill" rel="noopener noreferrer"&gt;github.com/info-dev-13/alphainfo-claude-skill&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HF Space (live demo)&lt;/strong&gt;: &lt;a href="https://huggingface.co/spaces/Alphainfo/alphainfo-claude-skill" rel="noopener noreferrer"&gt;huggingface.co/spaces/Alphainfo/alphainfo-claude-skill&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AlphaInfo API docs&lt;/strong&gt;: &lt;a href="https://www.alphainfo.io/v1/guide" rel="noopener noreferrer"&gt;alphainfo.io/v1/guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I'd love feedback from anyone building agent tools. What use cases am I missing? What domain probes would you want next? Comments open here, issues on GitHub.&lt;/p&gt;

&lt;p&gt;If you find this useful, a ⭐ on the repo would help me know it's worth iterating. 🙏&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>mlops</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why your time-series anomaly detection probably misses the real anomaly</title>
      <dc:creator>Alpha Info</dc:creator>
      <pubDate>Sun, 26 Apr 2026 08:26:51 +0000</pubDate>
      <link>https://dev.to/alpha_info/why-your-time-series-anomaly-detection-probably-misses-the-real-anomaly-36dn</link>
      <guid>https://dev.to/alpha_info/why-your-time-series-anomaly-detection-probably-misses-the-real-anomaly-36dn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Most "anomaly detection" code in production uses z-score, rolling means, or 3σ rules. These detect &lt;em&gt;mean shifts&lt;/em&gt;, not &lt;em&gt;structural changes&lt;/em&gt;. I built &lt;a href="https://www.alphainfo.io" rel="noopener noreferrer"&gt;AlphaInfo&lt;/a&gt; — a structural intelligence API that perceives signal shape via a 5-D fingerprint. One HTTP call returns calibrated severity, alert level, and an audit-replayable analysis ID. Free tier: 50 calls/month, no credit card.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The bug nobody catches
&lt;/h2&gt;

&lt;p&gt;A few months ago I was watching a team debug a production incident. Their alerting was based on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;recent_p99_latency&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rolling_mean&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rolling_std&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;page_oncall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual incident: a slow memory leak. P99 stayed within bounds because the leak was &lt;em&gt;gradual&lt;/em&gt;. By the time the rolling stats updated, the system was already degraded. The alert fired at 4 AM, after every user had felt it.&lt;/p&gt;

&lt;p&gt;The team's fix? Tighter thresholds. Which fired false positives the next week.&lt;/p&gt;

&lt;p&gt;This is the classic anomaly detection trap: &lt;strong&gt;statistical tools detect mean shifts. Real-world incidents are usually structural shifts.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What "structural" means here
&lt;/h2&gt;

&lt;p&gt;Same mean. Same variance. Different shape.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Both have the same mean (0), same std (1)
# But ONE is white noise, ONE is a sine wave
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="n"&gt;white&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# z-score / 3σ on either: identical
# Are they the same signal? Obviously not.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real-world version of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt; distribution before/after a deploy with same mean but new tail behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensor vibration&lt;/strong&gt; at same total energy but with new harmonic content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User session length&lt;/strong&gt; with same average but bimodal instead of unimodal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error rates&lt;/strong&gt; that look "normal" in aggregate but are clustered into bursts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;z-score sees none of these. ML classifiers can — if you train one. For &lt;em&gt;every&lt;/em&gt; metric. Forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.alphainfo.io" rel="noopener noreferrer"&gt;AlphaInfo&lt;/a&gt; is a Structural Intelligence API. You send two signals (or one for internal-change detection), it returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"structural_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence_band"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unstable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"change_detected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sim_local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sim_fractal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sim_spectral"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sim_transition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sim_trend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"semantic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"alert_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"recommended_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"immediate_human_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"⚠️ Spectral content shifted significantly..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"analysis_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5533a276-b4e2-461b-8b64-03bc30d565cc"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 5-D fingerprint (&lt;code&gt;sim_local&lt;/code&gt;, &lt;code&gt;sim_fractal&lt;/code&gt;, &lt;code&gt;sim_spectral&lt;/code&gt;, &lt;code&gt;sim_transition&lt;/code&gt;, &lt;code&gt;sim_trend&lt;/code&gt;) decomposes the structural change. When &lt;code&gt;sim_spectral&lt;/code&gt; drops to 0.18 while others stay high, you know the change is in &lt;em&gt;frequency content&lt;/em&gt; — useful for diagnostics.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;analysis_id&lt;/code&gt; is replayable forever via &lt;code&gt;audit_replay()&lt;/code&gt;. Reproduce any past analysis bit-exact. Critical for finance, biomed, and regulated domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six things you can do with one API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;alphainfo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AlphaInfo&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AlphaInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Anomaly without baseline
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect_internal_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cpu_metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.semantic.alert_level → "critical"
&lt;/span&gt;
&lt;span class="c1"&gt;# 2. Compare two states
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;after_deploy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;before_deploy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.structural_score → 0.34 (unstable)
&lt;/span&gt;
&lt;span class="c1"&gt;# 3. Locate WHEN something changed in a long stream
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_windowed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;long_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.worst_window → (start, end, score)
&lt;/span&gt;
&lt;span class="c1"&gt;# 4. Multi-sensor fault isolation (1 quota, up to 64 channels)
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;press&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;vib&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...},&lt;/span&gt;
                          &lt;span class="n"&gt;baselines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;press&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;vib&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...},&lt;/span&gt;
                          &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.channels["vib"].structural_score → 0.21 (the failing one)
&lt;/span&gt;
&lt;span class="c1"&gt;# 5. Auto-infer the right calibration
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_auto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mystery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.domain_inference → {inferred: "biomedical", confidence: 0.92, reasoning: ...}
&lt;/span&gt;
&lt;span class="c1"&gt;# 6. Parameter fitting (gradient-free)
&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit_parameter_grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;omega_0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;...},&lt;/span&gt;
                              &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# r.best_param → "omega_0.34"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ten domain calibrations + 21 recipes
&lt;/h2&gt;

&lt;p&gt;The API ships with calibrations for &lt;code&gt;finance&lt;/code&gt;, &lt;code&gt;biomedical&lt;/code&gt;, &lt;code&gt;sensors&lt;/code&gt;, &lt;code&gt;ai_ml&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;power_grid&lt;/code&gt;, &lt;code&gt;seismic&lt;/code&gt;, &lt;code&gt;traffic&lt;/code&gt;, plus &lt;code&gt;generic&lt;/code&gt; and &lt;code&gt;auto&lt;/code&gt;. Each tunes sensitivity for that vertical's typical signal characteristics (heavy tails, fast oscillations, sparse events, etc.).&lt;/p&gt;

&lt;p&gt;There's also a &lt;a href="https://www.alphainfo.io/v1/recipes" rel="noopener noreferrer"&gt;recipes layer&lt;/a&gt; with 21 production-ready recipes including 8 domain-specific probe libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;probes_finance&lt;/code&gt; — vol_regime, crash_event, momentum_break, mean_reversion_break, ...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probes_biomedical&lt;/code&gt; — tachycardia, bradycardia, PVC, lead_disconnect, atrial_fib, ...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probes_industrial&lt;/code&gt; — bearing_wear, imbalance, shock, cavitation, resonance, ...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probes_mlops&lt;/code&gt; — prediction_collapse, imbalance_shift, outlier_increase, ...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probes_security&lt;/code&gt; — traffic_spike, brute_force, scan_burst, dns_tunnel, ...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probes_logistics&lt;/code&gt;, &lt;code&gt;probes_energy_grid&lt;/code&gt;, &lt;code&gt;probes_climate&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;~80 pre-built probes. Plug-and-play for the most common patterns in each domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's been validated
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real PhysioNet ECG (record 208, N vs PVC)&lt;/strong&gt;: 100% cross-validation accuracy without training a model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real S&amp;amp;P 500 / BTC / VIX / Treasury daily data via yfinance&lt;/strong&gt;: regime change detection with localized boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-sensor HVAC fault&lt;/strong&gt;: correctly identifies the failing channel ("canal delator") in a single API call across 64 channels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server CPU anomaly&lt;/strong&gt;: 30-min sustained spike caught with severity 75 and localized timing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account takeover, ransomware-pattern, insider threat detection&lt;/strong&gt;: critical severity 67-96 on realistic data shapes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full validation matrix at &lt;a href="https://www.alphainfo.io" rel="noopener noreferrer"&gt;alphainfo.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free tier — try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.alphainfo.io/register?ref=devto" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; (no credit card) for 50 analyses/month. 4 paid tiers above that, from $49/mo to Enterprise. All 10 domain calibrations and all 21 recipes available on every tier — capacity is the differentiator, not features.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;alphainfo&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;alphainfo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AlphaInfo&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AlphaInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ai_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect_internal_change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;your_csv_column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sampling_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semantic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When NOT to use this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;em&gt;gradient-based&lt;/em&gt; anomaly detection (use isolation forest)&lt;/li&gt;
&lt;li&gt;Sub-100ms HTTP latency required (API floor is ~250ms; sub-100ms per-comparison via the vector endpoint OK)&lt;/li&gt;
&lt;li&gt;Billion-scale similarity search (use FAISS, then AlphaInfo for re-ranking)&lt;/li&gt;
&lt;li&gt;The "anomaly" is purely about magnitude with no shape change (use simple statistics — AlphaInfo measures structure, not magnitude)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API docs&lt;/strong&gt;: &lt;a href="https://www.alphainfo.io/v1/guide" rel="noopener noreferrer"&gt;alphainfo.io/v1/guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recipe library&lt;/strong&gt;: &lt;a href="https://www.alphainfo.io/v1/recipes" rel="noopener noreferrer"&gt;alphainfo.io/v1/recipes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tier signup&lt;/strong&gt;: &lt;a href="https://www.alphainfo.io/register?ref=devto" rel="noopener noreferrer"&gt;alphainfo.io/register&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: &lt;a href="https://www.alphainfo.io/pricing?ref=devto" rel="noopener noreferrer"&gt;alphainfo.io/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Next post: I'll show how to wire this API into Claude Code as a self-correcting skill — the AI agent calls the right method automatically, even retrying with alternative configs when the first answer is borderline. The combination is genuinely powerful.&lt;/p&gt;

&lt;p&gt;Feedback / use cases I'm missing — comments open. 🙏&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mlops</category>
      <category>observability</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
