Skip to content

🤖 Cannot save fiddle #2408

@madpixl

Description

@madpixl

Error code

ERRW:1.0:SL0.1:EL1.0:AS

Were you logged in?

Yes

Your username (if logged in)

madpixl

Your HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Agentic DevOps + SAFe Transformation Guide</title>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Syne:wght@400;700;800&family=DM+Sans:wght@300;400;500&display=swap" rel="stylesheet"/>
<style>:root{--bg:#07090f;--panel:#0d1220;--card:#111827;--card2:#0f1f35;--text:#dde6f0;--muted:#7a90a8;--accent:#00d4ff;--accent2:#7b61ff;--green:#22d98a;--yellow:#f5c842;--red:#ff5c72;--blue:#4a9eff;--border:#1c2d46;--sidebar-w:290px;--mono:'IBM Plex Mono',monospace;--head:'Syne',sans-serif;--body:'DM Sans',sans-serif}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--body);background:var(--bg);color:var(--text);display:flex;min-height:100vh;font-size:14px;line-height:1.7}.sidebar{width:var(--sidebar-w);position:fixed;top:0;left:0;bottom:0;background:var(--panel);border-right:1px solid var(--border);overflow-y:auto;display:flex;flex-direction:column;z-index:100}.sidebar-header{padding:22px 18px 14px;border-bottom:1px solid var(--border)}.brand{font-family:var(--head);font-size:13px;font-weight:800;color:var(--accent);letter-spacing:.06em;text-transform:uppercase}.brand-sub{font-size:11px;color:var(--muted);margin-top:3px}.nav-group{padding:10px 0}.nav-group-label{font-family:var(--mono);font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.1em;padding:6px 18px 4px}.nav a{display:block;padding:7px 18px;color:#6d8aaa;text-decoration:none;font-size:12px;line-height:1.4;border-left:2px solid transparent;transition:all .15s}.nav a:hover,.nav a.active{color:var(--accent);border-left-color:var(--accent);background:rgba(0,212,255,.05)}.nav-num{font-family:var(--mono);font-size:10px;color:var(--muted);margin-right:6px}.content{margin-left:var(--sidebar-w);padding:40px 44px 80px;max-width:1060px;width:100%}.page-title{font-family:var(--head);font-size:32px;font-weight:800;color:#fff;line-height:1.15;margin-bottom:6px}.page-sub{font-size:14px;color:var(--muted);margin-bottom:8px}.tag-row{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:36px}.tag{font-family:var(--mono);font-size:10px;padding:3px 10px;border-radius:20px;border:1px solid var(--border);color:var(--muted)}.topic{background:var(--panel);border:1px solid var(--border);border-radius:14px;margin-bottom:22px;overflow:hidden;scroll-margin-top:30px}.topic-header{padding:18px 22px;cursor:pointer;display:flex;justify-content:space-between;align-items:flex-start;gap:12px;user-select:none;transition:background .15s}.topic-header:hover{background:rgba(255,255,255,.02)}.topic-header-left{flex:1}.topic-num{font-family:var(--mono);font-size:11px;color:var(--accent);margin-bottom:3px}.topic-title{font-family:var(--head);font-size:16px;font-weight:700;color:#e8f0fa;line-height:1.3}.topic-q{font-size:12px;color:var(--muted);margin-top:3px;font-style:italic}.chevron{font-size:16px;color:var(--muted);transition:transform .2s;flex-shrink:0;margin-top:2px}.topic.open .chevron{transform:rotate(180deg)}.topic-body{display:none;padding:0 22px 22px;border-top:1px solid var(--border)}.topic.open .topic-body{display:block}.topic-intro{font-size:13px;color:var(--muted);margin:14px 0}.answer-banner{margin:16px 0 14px;padding:13px 16px;border-radius:9px;background:rgba(0,212,255,.07);border-left:3px solid var(--accent);font-size:14px;font-weight:500;color:#c8e8ff}.answer-banner--tbd{background:rgba(245,200,66,.07);border-left-color:var(--yellow);color:#fde68a}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:12px 0}.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin:12px 0}.card{background:var(--card);border:1px solid var(--border);border-radius:9px;padding:14px 16px}.card-label{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:7px}.card ul{padding-left:16px;color:var(--text);font-size:13px}.card ul li{margin-bottom:4px}.card p{font-size:13px;color:var(--text)}.prompt-label{font-family:var(--mono);font-size:10px;text-transform:uppercase;color:var(--accent2);margin-bottom:6px;letter-spacing:.08em}.prompt-box{background:#07111f;border:1px solid #1a3a5c;border-radius:9px;padding:14px 16px;margin:12px 0;font-family:var(--mono);font-size:12px;color:#8ecfff;line-height:1.7;white-space:pre-wrap}.agent-flow{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:12px 0;padding:13px 16px;background:var(--card2);border-radius:9px;border:1px solid #1a3050}.agent-step{background:#0e2040;border:1px solid #244068;border-radius:6px;padding:5px 11px;font-size:12px;color:#90c8ff;font-family:var(--mono);white-space:nowrap}.agent-arrow{color:var(--accent);font-size:14px;font-weight:bold}.agent-divider{color:var(--muted);font-size:11px;margin:0 4px}.agent-decision{background:#1a0e2e;border:1px solid #3d2a6e;border-radius:6px;padding:5px 11px;font-size:12px;color:#c4b0ff;font-family:var(--mono)}.links-row{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}.ref-link{display:inline-flex;align-items:center;gap:5px;background:#0d1e33;border:1px solid #1c3a5c;border-radius:6px;padding:4px 11px;font-size:12px;color:var(--blue);text-decoration:none;font-family:var(--mono);transition:all .15s}.ref-link:hover{background:#13294a;color:var(--accent);border-color:var(--accent)}.sl{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.09em;color:var(--accent);margin:16px 0 6px;padding-bottom:4px;border-bottom:1px solid var(--border)}.vsm-outer{margin:16px 0 0;background:var(--card);border:1px solid var(--border);border-radius:12px;overflow:hidden}.vsm-toolbar{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid var(--border);flex-wrap:wrap}.vsm-toolbar label{font-family:var(--mono);font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.07em}.vsm-toolbar select{background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-family:var(--mono);font-size:11px;padding:3px 8px;cursor:pointer}.vsm-hover-label{font-family:var(--mono);font-size:10px;color:var(--muted);margin-left:auto;transition:color .2s}.vsm-scroll{overflow-x:auto;padding:0 16px 0}.vsm-grid{display:flex;min-width:700px;padding:12px 0 8px;gap:0}.vsm-labels{display:flex;flex-direction:column;flex-shrink:0;width:80px;gap:4px;padding-top:52px}.vsm-row-label{display:flex;align-items:center;justify-content:flex-end;padding-right:8px;height:44px;font-family:var(--mono);font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;border-right:1px solid var(--border)}.vsm-row-label--user-active{color:var(--green)}.vsm-row-label--user-wait{color:var(--yellow)}.vsm-row-label--deliv-active{color:var(--blue)}.vsm-row-label--deliv-wait{color:var(--red)}.vsm-stages{display:flex;flex:1;gap:6px;padding-left:6px}.vsm-stage{display:flex;flex-direction:column;flex:1;min-width:90px;gap:4px;cursor:pointer;border-radius:6px;padding:4px;transition:background .15s;position:relative}.vsm-stage:hover{background:rgba(255,255,255,.03)}.vsm-stage.is-hovered{background:rgba(0,212,255,.04)}.vsm-process-box{background:#162338;border:1.5px solid #2a5a8a;border-radius:6px;padding:6px 4px;text-align:center;min-height:44px;display:flex;flex-direction:column;align-items:center;justify-content:center}.vsm-stage--ai .vsm-process-box{background:#0d2a3a;border-color:var(--accent);box-shadow:0 0 8px rgba(0,212,255,.15)}.vsm-process-name{font-family:var(--head);font-size:9px;font-weight:700;color:#c8dff0;line-height:1.3}.vsm-stage--ai .vsm-process-name{color:var(--accent)}.vsm-connector{position:absolute;right:-9px;top:20px;font-size:13px;color:#2a4a6e;z-index:2;pointer-events:none}.vsm-stage:last-child .vsm-connector{display:none}.vsm-bar-row{height:44px;display:flex;align-items:flex-end;position:relative;border-radius:4px;overflow:hidden}.vsm-bar-row--user-active{background:rgba(34,217,138,.06)}.vsm-bar-row--user-wait{background:rgba(245,200,66,.06)}.vsm-bar-row--deliv-active{background:rgba(74,158,255,.06)}.vsm-bar-row--deliv-wait{background:rgba(255,92,114,.06)}.vsm-bar{border-radius:3px 3px 0 0;display:flex;align-items:center;justify-content:center;transition:width .4s ease,height .4s ease;min-height:4px;width:70%;margin:0 auto}.vsm-bar--user-active{background:var(--green)}.vsm-bar--user-wait{background:var(--yellow)}.vsm-bar--deliv-active{background:var(--blue)}.vsm-bar--deliv-wait{background:var(--red)}.vsm-bar--zero{background:rgba(122,144,168,.2);min-height:3px}.vsm-bar-label{font-family:var(--mono);font-size:8px;font-weight:600;color:#07090f;white-space:nowrap}.vsm-bar-label--ext{position:absolute;bottom:2px;left:50%;transform:translateX(-50%);font-family:var(--mono);font-size:8px;color:var(--muted)}.vsm-stage-footer{display:flex;flex-direction:column;align-items:center;gap:2px;margin-top:2px;min-height:28px}.vsm-eff-pill{font-family:var(--mono);font-size:8px;font-weight:700;padding:2px 6px;border-radius:10px}.vsm-eff-pill--good{background:rgba(34,217,138,.15);color:var(--green)}.vsm-eff-pill--warn{background:rgba(245,200,66,.15);color:var(--yellow)}.vsm-eff-pill--bad{background:rgba(255,92,114,.15);color:var(--red)}.vsm-bottleneck-badge{font-family:var(--mono);font-size:7px;font-weight:700;background:var(--red);color:#07090f;padding:2px 5px;border-radius:3px;white-space:nowrap}.vsm-ai-badge{font-family:var(--mono);font-size:7px;color:var(--accent);opacity:.8}.vsm-summary{display:flex;flex-wrap:wrap;gap:14px;padding:12px 16px;border-top:1px solid var(--border);align-items:center}.vsm-summary-stat{font-family:var(--mono);font-size:11px;padding:4px 12px;border-radius:20px;border:1px solid var(--border);color:var(--muted)}.vsm-summary-stat--good{color:var(--green);border-color:var(--green);background:rgba(34,217,138,.06)}.vsm-summary-stat--warn{color:var(--yellow);border-color:var(--yellow);background:rgba(245,200,66,.06)}.vsm-summary-stat--bad{color:var(--red);border-color:var(--red);background:rgba(255,92,114,.06)}.vsm-summary-meta{font-family:var(--mono);font-size:11px;color:var(--muted)}.vsm-summary-meta strong{color:var(--accent)}.vsm-legend{display:flex;flex-wrap:wrap;gap:16px;padding:10px 16px 14px}.vsm-legend-item{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);font-family:var(--mono)}.vsm-swatch{width:12px;height:12px;border-radius:3px;flex-shrink:0}.vsm-swatch--green{background:var(--green)}.vsm-swatch--blue{background:var(--blue)}.vsm-swatch--yellow{background:var(--yellow)}.vsm-swatch--red{background:var(--red)}.vsm-swatch--ai{background:var(--accent);opacity:.5}.repair-loop{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:12px 0}.repair-step{background:var(--card);border:1px solid var(--border);border-radius:9px;padding:13px;position:relative}.repair-step::after{content:'→';position:absolute;right:-12px;top:50%;transform:translateY(-50%);color:var(--accent);font-size:14px;z-index:2}.repair-step:nth-child(3)::after,.repair-step:nth-child(6)::after{content:''}.repair-step-num{font-family:var(--mono);font-size:11px;color:var(--accent2);margin-bottom:4px}.repair-step-title{font-size:13px;font-weight:600;color:#dde6f0;margin-bottom:4px}.repair-step-desc{font-size:11px;color:var(--muted)}.metrics-row{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:18px 0}.metric-card{background:var(--card);border:1px solid var(--border);border-radius:9px;padding:14px;text-align:center}.metric-val{font-family:var(--mono);font-size:24px;font-weight:600;line-height:1;margin-bottom:4px}.metric-val--green{color:var(--green)}.metric-val--yellow{color:var(--yellow)}.metric-val--red{color:var(--red)}.metric-val--blue{color:var(--blue)}.metric-label{font-size:11px;color:var(--muted)}.callout{background:rgba(123,97,255,.07);border:1px solid rgba(123,97,255,.25);border-radius:9px;padding:13px 16px;font-size:13px;color:#c4b8ff;margin:12px 0}.callout strong{color:#a89cff}.page-footer{margin-top:40px;padding:20px;text-align:center;color:var(--muted);font-size:12px;border-top:1px solid var(--border)}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}</style>
</head>
<body>
<div class="sidebar"><div class="sidebar-header"><div class="brand">Agentic DevOps Guide</div><div class="brand-sub">DORA · SAFe · AI Transformation</div></div><div class="nav-group"><div class="nav-group-label">System</div><div class="nav"><a href="#overview">Overview &amp; Value Streams</a><a href="#repair">Agentic Repair Loop</a></div></div><div class="nav-group"><div class="nav-group-label">Topics</div><div class="nav"><a href="#t1"><span class="nav-num">01</span>Code Reviews in AI-First Teams</a><a href="#t2"><span class="nav-num">02</span>AI Before DORA Stability</a><a href="#t3"><span class="nav-num">03</span>Pushing Back on AI Pressure</a><a href="#t4"><span class="nav-num">04</span>The New Developer Role</a><a href="#t5"><span class="nav-num">05</span>DORA at Agent Speed</a><a href="#t6"><span class="nav-num">06</span>AI &amp; Cross-Role Collaboration</a><a href="#t7"><span class="nav-num">07</span>Agent Identity &amp; Traceability</a><a href="#t8"><span class="nav-num">08</span>PR Explosion &amp; Burnout Risk</a><a href="#t9"><span class="nav-num">09</span>AI Burn Rate &amp; Cost Control</a><a href="#t10"><span class="nav-num">10</span>Standard AI Instruction Files</a><a href="#t11"><span class="nav-num">11</span>AI Burnout: Is It Real?</a><a href="#t12"><span class="nav-num">12</span>Intelligent Developer Platforms</a><a href="#t13"><span class="nav-num">13</span>Individual vs Team Metrics</a><a href="#t14"><span class="nav-num">14</span>Are the DORA Keys Still Relevant?</a><a href="#t15"><span class="nav-num">15</span>When the Backlog Disappears</a><a href="#t16"><span class="nav-num">16</span>AI for Code Reviews</a><a href="#t17"><span class="nav-num">17</span>VSM to Track AI Bottlenecks</a><a href="#t18"><span class="nav-num">18</span>Reducing Assessment Fatigue</a><a href="#t19"><span class="nav-num">19</span>Making Assessments Valuable</a><a href="#t20"><span class="nav-num">20</span>AI in Technical Hiring</a><a href="#t21"><span class="nav-num">21</span>Metrics When Lead Time → Zero</a><a href="#t22"><span class="nav-num">22</span>Model Processes Before Automating</a><a href="#t23"><span class="nav-num">23</span>Quality Control at AI Speed</a></div></div></div><div class="content"><div class="page-title">Agentic DevOps &amp; SAFe<br/>Transformation Guide</div><div class="page-sub">Enterprise reference for Product Owners, TPOs, Architects &amp; Technical Leaders</div><div class="tag-row"><span class="tag">DORA 2024</span><span class="tag">SAFe 6.0</span><span class="tag">Agentic AI</span><span class="tag">Value Stream</span><span class="tag">DevOps</span><span class="tag">Platform Engineering</span></div><div class="topic open" id="overview"><div class="topic-header" onclick="toggleTopic(this)"><div class="topic-header-left"><div class="topic-num">SYSTEM OVERVIEW</div><div class="topic-title">Dual Value Stream Map: User Journey vs Delivery Flow</div><div class="topic-q">Where does time go between idea and production — and what does AI actually fix?</div></div><div class="chevron"></div></div><div class="topic-body"><p class="topic-intro">Each stage column shows four swimlane rows: user active (green), user wait (yellow), delivery active (blue), delivery gate/wait (red). Bar height is proportional to time. Toggle the view controls to compare Before vs After AI automation.</p><div class="vsm-outer"><div class="vsm-toolbar"><label>VIEW</label><select id="vsm-mode"><option value="both">Both Streams</option><option value="user">User Stream Only</option><option value="delivery">Delivery Stream Only</option></select><label>AI IMPACT</label><select id="vsm-ai"><option value="before">Before AI</option><option value="after">After AI Automation</option></select><span class="vsm-hover-label" id="vsm-hover-label">Hover a stage for details</span></div><div class="vsm-scroll"><div class="vsm-grid" id="vsm-grid"><div class="vsm-labels" id="vsm-labels"></div><div class="vsm-stages" id="vsm-stages"></div></div></div><div class="vsm-summary" id="vsm-summary"></div><div class="vsm-legend"><div class="vsm-legend-item"><span class="vsm-swatch vsm-swatch--green"></span>User active work</div><div class="vsm-legend-item"><span class="vsm-swatch vsm-swatch--blue"></span>Delivery active work</div><div class="vsm-legend-item"><span class="vsm-swatch vsm-swatch--yellow"></span>Wait / queue time</div><div class="vsm-legend-item"><span class="vsm-swatch vsm-swatch--red"></span>Bottleneck / approval gate</div><div class="vsm-legend-item"><span class="vsm-swatch vsm-swatch--ai"></span>✦ AI / Agent-operated stage</div></div></div><div class="metrics-row"><div class="metric-card"><div class="metric-val metric-val--green">70%</div><div class="metric-label">Flow efficiency target</div></div><div class="metric-card"><div class="metric-val metric-val--yellow">2.7×</div><div class="metric-label">PR volume increase (DORA 2024)</div></div><div class="metric-card"><div class="metric-val metric-val--red">~40%</div><div class="metric-label">Time lost in approval queues</div></div><div class="metric-card"><div class="metric-val metric-val--blue">80%</div><div class="metric-label">Reviews AI can automate</div></div></div><div class="callout"><strong>Key principle:</strong> AI doesn't optimize workflows — it <em>reveals</em> system design quality. Toggle "After AI" above and watch how <strong>Review &amp; Validate becomes the new bottleneck</strong> once Build is AI-accelerated. Stabilize flow first. Automate second. Observe always.</div><div class="links-row"><a class="ref-link" href="https://dora.dev/research/" target="_blank">↗ DORA Research</a><a class="ref-link" href="https://scaledagileframework.com/value-streams/" target="_blank">↗ SAFe Value Streams</a><a class="ref-link" href="https://itrevolution.com/articles/value-stream-mapping-for-devops/" target="_blank">↗ VSM for DevOps</a></div></div></div><div class="topic open" id="repair"><div class="topic-header" onclick="toggleTopic(this)"><div class="topic-header-left"><div class="topic-num">AGENTIC CORE</div><div class="topic-title">Self-Healing Agentic Repair Loop</div><div class="topic-q">How does an AI-native system detect problems, reason about them, and repair itself?</div></div><div class="chevron"></div></div><div class="topic-body"><div class="answer-banner">A truly agentic system doesn't just flag anomalies — it diagnoses, proposes, executes, verifies, and learns. This is the loop that separates AI-augmented DevOps from AI-native DevOps.</div><div class="repair-loop"><div class="repair-step"><div class="repair-step-num">STEP 01</div><div class="repair-step-title">🔍 Detect</div><div class="repair-step-desc">Observability triggers anomaly alert — latency spike, test failure, or drift from baseline SLO</div></div><div class="repair-step"><div class="repair-step-num">STEP 02</div><div class="repair-step-title">🧠 Diagnose</div><div class="repair-step-desc">AI agent reasons over logs, traces, and change history to identify probable root cause</div></div><div class="repair-step"><div class="repair-step-num">STEP 03</div><div class="repair-step-title">📋 Propose</div><div class="repair-step-desc">Agent generates candidate fix with a confidence score and blast-radius estimate</div></div><div class="repair-step"><div class="repair-step-num">STEP 04</div><div class="repair-step-title">⚡ Execute</div><div class="repair-step-desc">Apply fix (code patch, config change, rollback) within pre-approved scope and change window</div></div><div class="repair-step"><div class="repair-step-num">STEP 05</div><div class="repair-step-title">✅ Verify</div><div class="repair-step-desc">CI pipeline and telemetry confirms the fix resolved the anomaly without introducing regression</div></div><div class="repair-step"><div class="repair-step-num">STEP 06</div><div class="repair-step-title">📚 Learn</div><div class="repair-step-desc">Update runbooks, model context, and team knowledge base with outcome and decision rationale</div></div></div><div class="sl">AGENTIC WORKFLOW</div><div class="agent-flow"><span class="agent-step">Observability Alert</span><span class="agent-arrow"></span><span class="agent-step">AI Root Cause Analysis</span><span class="agent-arrow"></span><span class="agent-decision">Confidence ≥ 80%?</span><span class="agent-arrow"></span><span class="agent-step">Auto-patch + Verify</span><span class="agent-divider">|</span><span class="agent-decision">Confidence &lt; 80%?</span><span class="agent-arrow"></span><span class="agent-step">Human Review Queue</span><span class="agent-arrow"></span><span class="agent-step">Learn &amp; Update</span></div><div class="links-row"><a class="ref-link" href="https://opentelemetry.io/" target="_blank">↗ OpenTelemetry</a><a class="ref-link" href="https://dora.dev/research/" target="_blank">↗ DORA Reliability Metrics</a><a class="ref-link" href="https://sre.google/sre-book/table-of-contents/" target="_blank">↗ Google SRE Book</a></div></div></div><div class="topic" id="t1"><div class="topic-header" onclick="toggleTopic(this)"><div class="topic-header-left"><div class="topic-num">TOPIC 01 · Code Quality</div><div class="topic-title">Code Reviews in AI-First Teams</div><div class="topic-q">Should we just ditch code reviews?</div></div><div class="chevron"></div></div><div class="topic-body"><div class="answer-banner">No — evolve them. Code reviews shift from human gatekeeping to risk-based validation. AI handles the routine; humans protect the boundary.</div><div class="sl">BEST PRACTICE</div><p>AI should perform 70–90% of review work: linting, security scanning, test coverage gaps, dependency risks, and style compliance. Human review is reserved for changes


Your JavaScript

/* ───────────────────────────────────────────────
   TOGGLE SECTIONS
─────────────────────────────────────────────── */
function toggleTopic(el) {
  el.closest('.topic').classList.toggle('open');
}

/* ───────────────────────────────────────────────
   SIDEBAR ACTIVE LINK ON SCROLL
─────────────────────────────────────────────── */
(function () {
  const links = document.querySelectorAll('.nav a[href^="#"]');
  window.addEventListener('scroll', () => {
    let current = '';
    document.querySelectorAll('[id]').forEach(el => {
      if (window.scrollY >= el.offsetTop - 90) current = el.id;
    });
    links.forEach(a => {
      a.classList.toggle('active', a.getAttribute('href') === '#' + current);
    });
  });
})();

/* ═══════════════════════════════════════════════════════════════════
   VALUE STREAM MAP — DATA OBJECT
   ─────────────────────────────────────────────────────────────────
   Edit ONLY this object to change the diagram. All rendering is
   derived from this data. Each stage:

   label        string   — display name for the process box
   aiOperated   boolean  — true = AI accent colour and badge
   note         string   — shown in hover tooltip
   before / after        — time values in days for each mode
     .userActive   number — user stream: active work time
     .userWait     number — user stream: wait / queue time
     .delivActive  number — delivery stream: active work time
     .delivWait    number — delivery stream: bottleneck / gate time
     .bottleneck   boolean — true = renders red warning badge
═══════════════════════════════════════════════════════════════════ */
const VSM_DATA = {
  stages: [
    {
      label: 'Idea Capture',
      aiOperated: false,
      note: 'Work enters the system. No AI involvement yet. Wait time is driven by prioritisation queues and stakeholder availability.',
      before: { userActive: 1, userWait: 5, delivActive: 1, delivWait: 5, bottleneck: false },
      after:  { userActive: 1, userWait: 3, delivActive: 1, delivWait: 2, bottleneck: false }
    },
    {
      label: 'Review & Prioritize',
      aiOperated: false,
      note: '⚠ BOTTLENECK (Before AI): Approval gates and stakeholder alignment create the longest waits in most delivery systems before AI is introduced.',
      before: { userActive: 2, userWait: 6, delivActive: 2, delivWait: 6, bottleneck: true },
      after:  { userActive: 2, userWait: 4, delivActive: 2, delivWait: 4, bottleneck: false }
    },
    {
      label: 'Design & Spike',
      aiOperated: false,
      note: 'Technical discovery and architecture decisions. AI can assist with spike analysis, ADR drafting, and option evaluation but human judgment owns the decision.',
      before: { userActive: 1, userWait: 4, delivActive: 2, delivWait: 4, bottleneck: false },
      after:  { userActive: 1, userWait: 2, delivActive: 2, delivWait: 2, bottleneck: false }
    },
    {
      label: 'Build & Generate ✦',
      aiOperated: true,
      note: 'AI agents write code, generate tests, create PRs and documentation autonomously. Highest active-work volume. DORA 2024 reports 2.7× PR volume increase at this stage with AI.',
      before: { userActive: 10, userWait: 8,  delivActive: 20, delivWait: 8,  bottleneck: false },
      after:  { userActive: 10, userWait: 1,  delivActive: 20, delivWait: 1,  bottleneck: false }
    },
    {
      label: 'Review & Validate',
      aiOperated: false,
      note: '⚠ NEW BOTTLENECK (After AI): Human review queue overwhelmed by AI-generated PR volume. This is the critical post-AI transformation constraint that must be addressed.',
      before: { userActive: 1, userWait: 5, delivActive: 1, delivWait: 4, bottleneck: false },
      after:  { userActive: 1, userWait: 8, delivActive: 1, delivWait: 7, bottleneck: true }
    },
    {
      label: 'Deploy ✦',
      aiOperated: true,
      note: 'AI-assisted deployment pipeline. GitOps and automated progressive delivery (canary/blue-green) reduce wait states near zero. Human gates reserved for high-risk releases only.',
      before: { userActive: 1, userWait: 3, delivActive: 1, delivWait: 3, bottleneck: false },
      after:  { userActive: 1, userWait: 0, delivActive: 1, delivWait: 0, bottleneck: false }
    },
    {
      label: 'Observe & Learn ✦',
      aiOperated: true,
      note: 'Continuous AI-driven observability. No batch wait — monitoring is always-on. Feeds the agentic repair loop. Quality signals flow back to Build stage to close the learning cycle.',
      before: { userActive: 0, userWait: 0, delivActive: 0, delivWait: 0, bottleneck: false },
      after:  { userActive: 0, userWait: 0, delivActive: 0, delivWait: 0, bottleneck: false }
    }
  ]
};

/* ───────────────────────────────────────────────
   VSM RENDERER — pure DOM/flexbox, zero canvas
─────────────────────────────────────────────── */
(function () {
  const modeEl    = document.getElementById('vsm-mode');
  const aiEl      = document.getElementById('vsm-ai');
  const hoverLbl  = document.getElementById('vsm-hover-label');
  const labelsEl  = document.getElementById('vsm-labels');
  const stagesEl  = document.getElementById('vsm-stages');
  const summaryEl = document.getElementById('vsm-summary');

  const BAR_MAX_H = 36; // px — max bar height in each row cell

  /* ── Compute max value across all stages for a given mode/ai ── */
  function getMaxVal(aiMode, streamMode) {
    let max = 0;
    VSM_DATA.stages.forEach(s => {
      const d = s[aiMode];
      if (streamMode !== 'delivery') max = Math.max(max, d.userActive + d.userWait);
      if (streamMode !== 'user')     max = Math.max(max, d.delivActive + d.delivWait);
    });
    return max || 1;
  }

  /* ── Build a single bar element ── */
  function makeBar(value, maxVal, modClass, labelText) {
    const row = document.createElement('div');
    row.className = 'vsm-bar-row vsm-bar-row--' + modClass;

    const bar = document.createElement('div');
    const pct  = value === 0 ? 0 : Math.max(4, Math.round((value / maxVal) * BAR_MAX_H));
    bar.className = 'vsm-bar vsm-bar--' + (value === 0 ? 'zero' : modClass);
    bar.style.height = pct + 'px';

    if (value > 0 && pct >= 14) {
      const lbl = document.createElement('span');
      lbl.className = 'vsm-bar-label';
      lbl.textContent = value + 'd';
      bar.appendChild(lbl);
    } else if (value > 0) {
      const extLbl = document.createElement('span');
      extLbl.className = 'vsm-bar-label--ext';
      extLbl.textContent = value + 'd';
      row.appendChild(extLbl);
    }
    row.appendChild(bar);
    return row;
  }

  /* ── Render full VSM ── */
  function render() {
    const aiMode  = aiEl.value;     // 'before' | 'after'
    const sMode   = modeEl.value;   // 'both' | 'user' | 'delivery'
    const maxVal  = getMaxVal(aiMode, sMode);
    const showUser  = sMode !== 'delivery';
    const showDeliv = sMode !== 'user';

    /* Build label column */
    labelsEl.innerHTML = '';
    if (showUser) {
      const la = document.createElement('div');
      la.className = 'vsm-row-label vsm-row-label--user-active';
      la.textContent = '▣ Active';
      labelsEl.appendChild(la);

      const lw = document.createElement('div');
      lw.className = 'vsm-row-label vsm-row-label--user-wait';
      lw.textContent = '⧖ Wait';
      labelsEl.appendChild(lw);
    }
    if (showDeliv) {
      const la = document.createElement('div');
      la.className = 'vsm-row-label vsm-row-label--deliv-active';
      la.textContent = '▣ Active';
      labelsEl.appendChild(la);

      const lw = document.createElement('div');
      lw.className = 'vsm-row-label vsm-row-label--deliv-wait';
      lw.textContent = '⧖ Gate';
      labelsEl.appendChild(lw);
    }

    /* Build stage columns */
    stagesEl.innerHTML = '';
    let totalActive = 0, totalWait = 0;

    VSM_DATA.stages.forEach((stage, idx) => {
      const d   = stage[aiMode];
      const col = document.createElement('div');
      col.className = 'vsm-stage' + (stage.aiOperated ? ' vsm-stage--ai' : '');
      col.dataset.idx = idx;

      /* Process box */
      const box = document.createElement('div');
      box.className = 'vsm-process-box';
      const name = document.createElement('div');
      name.className = 'vsm-process-name';
      name.textContent = stage.label;
      box.appendChild(name);
      col.appendChild(box);

      /* Connector arrow */
      const conn = document.createElement('span');
      conn.className = 'vsm-connector';
      conn.textContent = '→';
      col.appendChild(conn);

      /* Bar rows per active stream */
      if (showUser) {
        col.appendChild(makeBar(d.userActive, maxVal, 'user-active'));
        col.appendChild(makeBar(d.userWait,   maxVal, 'user-wait'));
      }
      if (showDeliv) {
        col.appendChild(makeBar(d.delivActive, maxVal, 'deliv-active'));
        col.appendChild(makeBar(d.delivWait,   maxVal, 'deliv-wait'));
      }

      /* Footer: efficiency pill + badges */
      const footer = document.createElement('div');
      footer.className = 'vsm-stage-footer';

      const act = (showUser ? d.userActive : 0) + (showDeliv ? d.delivActive : 0);
      const tot = act + (showUser ? d.userWait : 0) + (showDeliv ? d.delivWait : 0);
      const eff = tot === 0 ? 100 : Math.round((act / tot) * 100);
      const pillMod = eff >= 70 ? 'good' : eff >= 40 ? 'warn' : 'bad';

      const pill = document.createElement('span');
      pill.className = 'vsm-eff-pill vsm-eff-pill--' + pillMod;
      pill.textContent = eff + '% eff.';
      footer.appendChild(pill);

      if (d.bottleneck) {
        const badge = document.createElement('span');
        badge.className = 'vsm-bottleneck-badge';
        badge.textContent = '⚠ BOTTLENECK';
        footer.appendChild(badge);
      }
      if (stage.aiOperated) {
        const aib = document.createElement('span');
        aib.className = 'vsm-ai-badge';
        aib.textContent = '✦ AI';
        footer.appendChild(aib);
      }
      col.appendChild(footer);

      /* Hover events */
      col.addEventListener('mouseenter', () => {
        col.classList.add('is-hovered');
        hoverLbl.textContent = stage.note || stage.label;
      });
      col.addEventListener('mouseleave', () => {
        col.classList.remove('is-hovered');
        hoverLbl.textContent = 'Hover a stage for details';
      });

      stagesEl.appendChild(col);

      /* Accumulate for summary */
      if (showUser)  { totalActive += d.userActive;  totalWait += d.userWait; }
      if (showDeliv) { totalActive += d.delivActive; totalWait += d.delivWait; }
    });

    /* Summary bar */
    const totalDays  = totalActive + totalWait;
    const overallEff = totalDays === 0 ? 100 : Math.round((totalActive / totalDays) * 100);
    const effMod     = overallEff >= 60 ? 'good' : overallEff >= 35 ? 'warn' : 'bad';

    summaryEl.innerHTML = '';

    const stat = document.createElement('span');
    stat.className = 'vsm-summary-stat vsm-summary-stat--' + effMod;
    stat.innerHTML = `Overall Flow Efficiency: ${totalActive}d active / ${totalDays}d total = <strong>${overallEff}%</strong>`;
    summaryEl.appendChild(stat);

    const meta = document.createElement('span');
    meta.className = 'vsm-summary-meta';
    meta.innerHTML = `Target: ≥70% &nbsp;|&nbsp; Industry avg: ~35% &nbsp;|&nbsp; Mode: <strong>${aiEl.options[aiEl.selectedIndex].text}</strong>`;
    summaryEl.appendChild(meta);
  }

  /* ── Control listeners ── */
  modeEl.addEventListener('change', render);
  aiEl.addEventListener('change',   render);

  /* ── Initial render ── */
  render();
})();

Your CSS

/* ═══════════════════════════════════════════════════
   1. DESIGN TOKENS
═══════════════════════════════════════════════════ */
:root {
  --bg:          #07090f;
  --panel:       #0d1220;
  --card:        #111827;
  --card2:       #0f1f35;
  --text:        #dde6f0;
  --muted:       #7a90a8;
  --accent:      #00d4ff;
  --accent2:     #7b61ff;
  --green:       #22d98a;
  --yellow:      #f5c842;
  --red:         #ff5c72;
  --blue:        #4a9eff;
  --border:      #1c2d46;
  --sidebar-w:   290px;
  --mono:        'IBM Plex Mono', monospace;
  --head:        'Syne', sans-serif;
  --body:        'DM Sans', sans-serif;
}

/* ═══════════════════════════════════════════════════
   2. RESET
═══════════════════════════════════════════════════ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

/* ═══════════════════════════════════════════════════
   3. BASE
═══════════════════════════════════════════════════ */
body {
  font-family: var(--body);
  background: var(--bg);
  color: var(--text);
  display: flex;
  min-height: 100vh;
  font-size: 14px;
  line-height: 1.7;
}

/* ═══════════════════════════════════════════════════
   4. SIDEBAR
═══════════════════════════════════════════════════ */
.sidebar {
  width: var(--sidebar-w);
  position: fixed;
  top: 0; left: 0; bottom: 0;
  background: var(--panel);
  border-right: 1px solid var(--border);
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  z-index: 100;
}
.sidebar-header {
  padding: 22px 18px 14px;
  border-bottom: 1px solid var(--border);
}
.brand {
  font-family: var(--head);
  font-size: 13px;
  font-weight: 800;
  color: var(--accent);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.brand-sub {
  font-size: 11px;
  color: var(--muted);
  margin-top: 3px;
}
.nav-group { padding: 10px 0; }
.nav-group-label {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  padding: 6px 18px 4px;
}
.nav a {
  display: block;
  padding: 7px 18px;
  color: #6d8aaa;
  text-decoration: none;
  font-size: 12px;
  line-height: 1.4;
  border-left: 2px solid transparent;
  transition: all 0.15s;
}
.nav a:hover,
.nav a.active {
  color: var(--accent);
  border-left-color: var(--accent);
  background: rgba(0,212,255,0.05);
}
.nav-num {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--muted);
  margin-right: 6px;
}

/* ═══════════════════════════════════════════════════
   5. CONTENT AREA
═══════════════════════════════════════════════════ */
.content {
  margin-left: var(--sidebar-w);
  padding: 40px 44px 80px;
  max-width: 1060px;
  width: 100%;
}

/* ═══════════════════════════════════════════════════
   6. PAGE HEADER
═══════════════════════════════════════════════════ */
.page-title {
  font-family: var(--head);
  font-size: 32px;
  font-weight: 800;
  color: #fff;
  line-height: 1.15;
  margin-bottom: 6px;
}
.page-sub {
  font-size: 14px;
  color: var(--muted);
  margin-bottom: 8px;
}
.tag-row {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 36px;
}
.tag {
  font-family: var(--mono);
  font-size: 10px;
  padding: 3px 10px;
  border-radius: 20px;
  border: 1px solid var(--border);
  color: var(--muted);
}

/* ═══════════════════════════════════════════════════
   7. TOPIC SECTIONS (collapsible)
═══════════════════════════════════════════════════ */
.topic {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 14px;
  margin-bottom: 22px;
  overflow: hidden;
  scroll-margin-top: 30px;
}
.topic-header {
  padding: 18px 22px;
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 12px;
  user-select: none;
  transition: background 0.15s;
}
.topic-header:hover { background: rgba(255,255,255,0.02); }
.topic-header-left { flex: 1; }
.topic-num {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--accent);
  margin-bottom: 3px;
}
.topic-title {
  font-family: var(--head);
  font-size: 16px;
  font-weight: 700;
  color: #e8f0fa;
  line-height: 1.3;
}
.topic-q {
  font-size: 12px;
  color: var(--muted);
  margin-top: 3px;
  font-style: italic;
}
.chevron {
  font-size: 16px;
  color: var(--muted);
  transition: transform 0.2s;
  flex-shrink: 0;
  margin-top: 2px;
}
.topic.open .chevron { transform: rotate(180deg); }
.topic-body {
  display: none;
  padding: 0 22px 22px;
  border-top: 1px solid var(--border);
}
.topic.open .topic-body { display: block; }
.topic-intro {
  font-size: 13px;
  color: var(--muted);
  margin: 14px 0;
}

/* ═══════════════════════════════════════════════════
   8. ANSWER BANNERS
═══════════════════════════════════════════════════ */
.answer-banner {
  margin: 16px 0 14px;
  padding: 13px 16px;
  border-radius: 9px;
  background: rgba(0,212,255,0.07);
  border-left: 3px solid var(--accent);
  font-size: 14px;
  font-weight: 500;
  color: #c8e8ff;
}
.answer-banner--tbd {
  background: rgba(245,200,66,0.07);
  border-left-color: var(--yellow);
  color: #fde68a;
}

/* ═══════════════════════════════════════════════════
   9. GRID LAYOUTS
═══════════════════════════════════════════════════ */
.grid2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin: 12px 0;
}
.grid3 {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 12px;
  margin: 12px 0;
}

/* ═══════════════════════════════════════════════════
   10. CARDS
═══════════════════════════════════════════════════ */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 9px;
  padding: 14px 16px;
}
.card-label {
  font-family: var(--mono);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
  margin-bottom: 7px;
}
.card ul { padding-left: 16px; color: var(--text); font-size: 13px; }
.card ul li { margin-bottom: 4px; }
.card p { font-size: 13px; color: var(--text); }

/* ═══════════════════════════════════════════════════
   11. AI PROMPT BOX
═══════════════════════════════════════════════════ */
.prompt-label {
  font-family: var(--mono);
  font-size: 10px;
  text-transform: uppercase;
  color: var(--accent2);
  margin-bottom: 6px;
  letter-spacing: 0.08em;
}
.prompt-box {
  background: #07111f;
  border: 1px solid #1a3a5c;
  border-radius: 9px;
  padding: 14px 16px;
  margin: 12px 0;
  font-family: var(--mono);
  font-size: 12px;
  color: #8ecfff;
  line-height: 1.7;
  white-space: pre-wrap;
}

/* ═══════════════════════════════════════════════════
   12. AGENTIC FLOW CHIPS
═══════════════════════════════════════════════════ */
.agent-flow {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  margin: 12px 0;
  padding: 13px 16px;
  background: var(--card2);
  border-radius: 9px;
  border: 1px solid #1a3050;
}
.agent-step {
  background: #0e2040;
  border: 1px solid #244068;
  border-radius: 6px;
  padding: 5px 11px;
  font-size: 12px;
  color: #90c8ff;
  font-family: var(--mono);
  white-space: nowrap;
}
.agent-arrow {
  color: var(--accent);
  font-size: 14px;
  font-weight: bold;
}
.agent-divider {
  color: var(--muted);
  font-size: 11px;
  margin: 0 4px;
}
.agent-decision {
  background: #1a0e2e;
  border: 1px solid #3d2a6e;
  border-radius: 6px;
  padding: 5px 11px;
  font-size: 12px;
  color: #c4b0ff;
  font-family: var(--mono);
}

/* ═══════════════════════════════════════════════════
   13. REFERENCE LINKS
═══════════════════════════════════════════════════ */
.links-row {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 10px 0;
}
.ref-link {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  background: #0d1e33;
  border: 1px solid #1c3a5c;
  border-radius: 6px;
  padding: 4px 11px;
  font-size: 12px;
  color: var(--blue);
  text-decoration: none;
  font-family: var(--mono);
  transition: all 0.15s;
}
.ref-link:hover {
  background: #13294a;
  color: var(--accent);
  border-color: var(--accent);
}

/* ═══════════════════════════════════════════════════
   14. SECTION DIVIDER LABEL
═══════════════════════════════════════════════════ */
.sl {
  font-family: var(--mono);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--accent);
  margin: 16px 0 6px;
  padding-bottom: 4px;
  border-bottom: 1px solid var(--border);
}

/* ═══════════════════════════════════════════════════
   15. VALUE STREAM MAP — pure flexbox/HTML5, no canvas
═══════════════════════════════════════════════════ */
.vsm-outer {
  margin: 16px 0 0;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 12px;
  overflow: hidden;
}

/* Controls toolbar */
.vsm-toolbar {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
}
.vsm-toolbar label {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.07em;
}
.vsm-toolbar select {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 4px;
  color: var(--text);
  font-family: var(--mono);
  font-size: 11px;
  padding: 3px 8px;
  cursor: pointer;
}
.vsm-hover-label {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--muted);
  margin-left: auto;
  transition: color 0.2s;
}

/* Scrollable stage strip */
.vsm-scroll {
  overflow-x: auto;
  padding: 0 16px 0;
}

/* Row header column + stages grid */
.vsm-grid {
  display: flex;
  min-width: 700px;
  padding: 12px 0 8px;
  gap: 0;
}

/* Left label column */
.vsm-labels {
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  width: 80px;
  gap: 4px;
  padding-top: 52px; /* align with process boxes */
}
.vsm-row-label {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding-right: 8px;
  height: 44px;
  font-family: var(--mono);
  font-size: 9px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  border-right: 1px solid var(--border);
}
.vsm-row-label--user-active  { color: var(--green); }
.vsm-row-label--user-wait    { color: var(--yellow); }
.vsm-row-label--deliv-active { color: var(--blue); }
.vsm-row-label--deliv-wait   { color: var(--red); }

/* Stages area */
.vsm-stages {
  display: flex;
  flex: 1;
  gap: 6px;
  padding-left: 6px;
}

/* Single stage column */
.vsm-stage {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 90px;
  gap: 4px;
  cursor: pointer;
  border-radius: 6px;
  padding: 4px;
  transition: background 0.15s;
  position: relative;
}
.vsm-stage:hover { background: rgba(255,255,255,0.03); }
.vsm-stage.is-hovered { background: rgba(0,212,255,0.04); }

/* Process box (top of column) */
.vsm-process-box {
  background: #162338;
  border: 1.5px solid #2a5a8a;
  border-radius: 6px;
  padding: 6px 4px;
  text-align: center;
  min-height: 44px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.vsm-stage--ai .vsm-process-box {
  background: #0d2a3a;
  border-color: var(--accent);
  box-shadow: 0 0 8px rgba(0,212,255,0.15);
}
.vsm-process-name {
  font-family: var(--head);
  font-size: 9px;
  font-weight: 700;
  color: #c8dff0;
  line-height: 1.3;
}
.vsm-stage--ai .vsm-process-name { color: var(--accent); }

/* Connector arrow between process boxes */
.vsm-connector {
  position: absolute;
  right: -9px;
  top: 20px;
  font-size: 13px;
  color: #2a4a6e;
  z-index: 2;
  pointer-events: none;
}
.vsm-stage:last-child .vsm-connector { display: none; }

/* Bar rows */
.vsm-bar-row {
  height: 44px;
  display: flex;
  align-items: flex-end;
  position: relative;
  border-radius: 4px;
  overflow: hidden;
}
.vsm-bar-row--user-active  { background: rgba(34,217,138,0.06); }
.vsm-bar-row--user-wait    { background: rgba(245,200,66,0.06); }
.vsm-bar-row--deliv-active { background: rgba(74,158,255,0.06); }
.vsm-bar-row--deliv-wait   { background: rgba(255,92,114,0.06); }

.vsm-bar {
  border-radius: 3px 3px 0 0;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: width 0.4s ease, height 0.4s ease;
  min-height: 4px;
  width: 70%;
  margin: 0 auto;
}
.vsm-bar--user-active  { background: var(--green); }
.vsm-bar--user-wait    { background: var(--yellow); }
.vsm-bar--deliv-active { background: var(--blue); }
.vsm-bar--deliv-wait   { background: var(--red); }
.vsm-bar--zero         { background: rgba(122,144,168,0.2); min-height: 3px; }

.vsm-bar-label {
  font-family: var(--mono);
  font-size: 8px;
  font-weight: 600;
  color: #07090f;
  white-space: nowrap;
}
.vsm-bar-label--ext {
  position: absolute;
  bottom: 2px;
  left: 50%;
  transform: translateX(-50%);
  font-family: var(--mono);
  font-size: 8px;
  color: var(--muted);
}

/* Efficiency + bottleneck badges */
.vsm-stage-footer {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  margin-top: 2px;
  min-height: 28px;
}
.vsm-eff-pill {
  font-family: var(--mono);
  font-size: 8px;
  font-weight: 700;
  padding: 2px 6px;
  border-radius: 10px;
}
.vsm-eff-pill--good   { background: rgba(34,217,138,0.15); color: var(--green); }
.vsm-eff-pill--warn   { background: rgba(245,200,66,0.15); color: var(--yellow); }
.vsm-eff-pill--bad    { background: rgba(255,92,114,0.15); color: var(--red); }

.vsm-bottleneck-badge {
  font-family: var(--mono);
  font-size: 7px;
  font-weight: 700;
  background: var(--red);
  color: #07090f;
  padding: 2px 5px;
  border-radius: 3px;
  white-space: nowrap;
}
.vsm-ai-badge {
  font-family: var(--mono);
  font-size: 7px;
  color: var(--accent);
  opacity: 0.8;
}

/* Summary bar */
.vsm-summary {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  padding: 12px 16px;
  border-top: 1px solid var(--border);
  align-items: center;
}
.vsm-summary-stat {
  font-family: var(--mono);
  font-size: 11px;
  padding: 4px 12px;
  border-radius: 20px;
  border: 1px solid var(--border);
  color: var(--muted);
}
.vsm-summary-stat--good  { color: var(--green); border-color: var(--green); background: rgba(34,217,138,0.06); }
.vsm-summary-stat--warn  { color: var(--yellow); border-color: var(--yellow); background: rgba(245,200,66,0.06); }
.vsm-summary-stat--bad   { color: var(--red); border-color: var(--red); background: rgba(255,92,114,0.06); }
.vsm-summary-meta {
  font-family: var(--mono);
  font-size: 11px;
  color: var(--muted);
}
.vsm-summary-meta strong { color: var(--accent); }

/* Legend */
.vsm-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  padding: 10px 16px 14px;
}
.vsm-legend-item {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  color: var(--muted);
  font-family: var(--mono);
}
.vsm-swatch {
  width: 12px;
  height: 12px;
  border-radius: 3px;
  flex-shrink: 0;
}
.vsm-swatch--green  { background: var(--green); }
.vsm-swatch--blue   { background: var(--blue); }
.vsm-swatch--yellow { background: var(--yellow); }
.vsm-swatch--red    { background: var(--red); }
.vsm-swatch--ai     { background: var(--accent); opacity: 0.5; }

/* ═══════════════════════════════════════════════════
   16. REPAIR LOOP
═══════════════════════════════════════════════════ */
.repair-loop {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  margin: 12px 0;
}
.repair-step {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 9px;
  padding: 13px;
  position: relative;
}
.repair-step::after {
  content: '→';
  position: absolute;
  right: -12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--accent);
  font-size: 14px;
  z-index: 2;
}
.repair-step:nth-child(3)::after,
.repair-step:nth-child(6)::after { content: ''; }
.repair-step-num   { font-family: var(--mono); font-size: 11px; color: var(--accent2); margin-bottom: 4px; }
.repair-step-title { font-size: 13px; font-weight: 600; color: #dde6f0; margin-bottom: 4px; }
.repair-step-desc  { font-size: 11px; color: var(--muted); }

/* ═══════════════════════════════════════════════════
   17. HERO METRICS ROW
═══════════════════════════════════════════════════ */
.metrics-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
  margin: 18px 0;
}
.metric-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 9px;
  padding: 14px;
  text-align: center;
}
.metric-val {
  font-family: var(--mono);
  font-size: 24px;
  font-weight: 600;
  line-height: 1;
  margin-bottom: 4px;
}
.metric-val--green  { color: var(--green); }
.metric-val--yellow { color: var(--yellow); }
.metric-val--red    { color: var(--red); }
.metric-val--blue   { color: var(--blue); }
.metric-label { font-size: 11px; color: var(--muted); }

/* ═══════════════════════════════════════════════════
   18. CALLOUT BOX
═══════════════════════════════════════════════════ */
.callout {
  background: rgba(123,97,255,0.07);
  border: 1px solid rgba(123,97,255,0.25);
  border-radius: 9px;
  padding: 13px 16px;
  font-size: 13px;
  color: #c4b8ff;
  margin: 12px 0;
}
.callout strong { color: #a89cff; }

/* ═══════════════════════════════════════════════════
   19. PAGE FOOTER
═══════════════════════════════════════════════════ */
.page-footer {
  margin-top: 40px;
  padding: 20px;
  text-align: center;
  color: var(--muted);
  font-size: 12px;
  border-top: 1px solid var(--border);
}

/* ═══════════════════════════════════════════════════
   20. SCROLLBAR
═══════════════════════════════════════════════════ */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions