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 & 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 & Cross-Role Collaboration</a><a href="#t7"><span class="nav-num">07</span>Agent Identity & Traceability</a><a href="#t8"><span class="nav-num">08</span>PR Explosion & Burnout Risk</a><a href="#t9"><span class="nav-num">09</span>AI Burn Rate & 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 & SAFe<br/>Transformation Guide</div><div class="page-sub">Enterprise reference for Product Owners, TPOs, Architects & 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 & 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 < 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 & 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% | Industry avg: ~35% | 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; }
Error code
ERRW:1.0:SL0.1:EL1.0:AS
Were you logged in?
Yes
Your username (if logged in)
madpixl
Your HTML
Your JavaScript
Your CSS