{"id":14,"date":"2025-12-08T12:09:45","date_gmt":"2025-12-08T12:09:45","guid":{"rendered":"https:\/\/steadyrabbit.in\/blogs\/?p=14"},"modified":"2025-12-09T10:45:58","modified_gmt":"2025-12-09T10:45:58","slug":"plan-left-code-left-measure-left-a-sprint-by-sprint-guide-to-real-shift-left","status":"publish","type":"post","link":"https:\/\/steadyrabbit.in\/blogs\/plan-left-code-left-measure-left-a-sprint-by-sprint-guide-to-real-shift-left\/","title":{"rendered":"Plan-Left, Code-Left, Measure-Left: A Sprint-by-Sprint Guide to Real Shift-Left"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ship predictably by moving planning, testing and metrics to the very start of every iteration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cShift-Left\u201d dies in committees when it means \u201cQA starts earlier.\u201d Real shift-left moves <strong>planning<\/strong>, <strong>testing<\/strong>, <strong>metrics<\/strong>, and <strong>risk gates<\/strong> to the very start of every sprint. In this deep dive we unpack the <em>Plan-Left \u2192 Code-Left \u2192 Measure-Left<\/em> triangle we use inside every Micro-GCC squad to hit 95-100 % schedule adherence across 40+ engagements.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why \u201cQA Earlier\u201d<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teams add a tester during backlog grooming and call it shift-left\u2014then wonder why releases still burn. The reason: only <strong>one<\/strong> of four failure modes happens in QA. The rest hide in unclear requirements, un-observed code, and lagging metrics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Four failure roots<\/strong><br><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ambiguous requirements (Plan)<br><\/li>\n\n\n\n<li>Implicit code paths (Code)<br><\/li>\n\n\n\n<li>Late feedback loops (Measure)<br><\/li>\n\n\n\n<li>Defects in QA (classic)<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Shift-left that fixes only #4 reduces rework ~15 %. Tackle all four and rework plummets 40-60 %.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Artifacts you need before sprint kickoff<br><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Artifact<\/strong><\/td><td><strong>Purpose<\/strong><\/td><td><strong>Owner<\/strong><\/td><\/tr><tr><td><strong>Risk Matrix<\/strong><\/td><td>Ranks user stories by business &amp; tech risk<\/td><td>Squad Lead<\/td><\/tr><tr><td><strong>Definition of Ready (DoR)<\/strong><\/td><td>8-point checklist (persona, acceptance tests, perf NFR, risk)<\/td><td>Product Lead<\/td><\/tr><tr><td><strong>Architecture Spike<\/strong><\/td><td>2-hour whiteboard or Mermaid diagram<\/td><td>Tech Lead<\/td><\/tr><tr><td><strong>Capacity Forecast<\/strong><\/td><td>SteadCAST auto-pulls PTO, velocity deltas<\/td><td>Delivery Lead<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>How to implement:<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add a <strong>Plan-Left column<\/strong> to the sprint board. No card moves to \u201cIn-Progress\u201d until DoR \u2713.<br><\/li>\n\n\n\n<li>Risk Matrix auto-expands into Jira labels (\u201crisk-high\u201d, \u201cperf-critical\u201d).<br><\/li>\n\n\n\n<li>Capacity Forecast posts a Slack alert if velocity dips > 15 %.<br><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Code-Left: GenAI Tests &amp; SBOM on Every PR (420 w)<\/strong><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GenAI Unit-Test Scaffolds<\/strong><strong><br><\/strong>\n<ul class=\"wp-block-list\">\n<li>GitHub Action calls our test-writer (> 80 % line coverage).<br><\/li>\n\n\n\n<li>Developer reviews, tweaks, commits in same PR.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Static Analysis Gates<\/strong><strong><br><\/strong>\n<ul class=\"wp-block-list\">\n<li>ESLint \/ golangci-lint fail fast.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>SBOM Generation<\/strong><strong><br><\/strong>\n<ul class=\"wp-block-list\">\n<li>CycloneDX JSON artifact persists to S3; hash posted to PR.<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Peer Review \u2194 Pair Review<\/strong><strong><br><\/strong>\n<ul class=\"wp-block-list\">\n<li>Risk-high stories trigger 2-reviewer rule; others 1.<br><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tip:<\/strong> hide GenAI test noise\u2014diff-filter *-gen.test.js by default; reviewers focus on logic, not snapshots.<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Measure-Left: Leading Indicators in the Same Sprint (280 w)<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Traditional metrics (velocity, escaped-defects) report too late. We track <strong>lead indicators<\/strong> that warn two sprints ahead:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Indicator<\/strong><\/td><td><strong>Target<\/strong><\/td><td><strong>Why it Matters<\/strong><\/td><\/tr><tr><td><strong>Risk-High WIP %<\/strong><\/td><td>&lt; 25 % of sprint cards<\/td><td>Too many risk stories = schedule slip<\/td><\/tr><tr><td><strong>Time-to-First-Review<\/strong><\/td><td>&lt; 2 h<\/td><td>Long waits \u2192 merge pile-ups<\/td><\/tr><tr><td><strong>Test Coverage \u0394<\/strong><\/td><td>+2 % each sprint until 80 %<\/td><td>Plateau early? Tech debt rising<\/td><\/tr><tr><td><strong>SBOM Build Time Penalty<\/strong><\/td><td>&lt; 5 % of total CI time<\/td><td>Large \u0394 means dependency bloat<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">SteadCAST posts a Friday dashboard; Squad retro reviews any amber\/red cells.<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Sprint-by-Sprint Rollout Checklist (185 w)<\/strong><\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Sprint<\/strong><\/td><td><strong>Additions<\/strong><\/td><\/tr><tr><td><strong>Week 0<\/strong><\/td><td>Install SBOM Action, baseline coverage, create Risk Matrix template<\/td><\/tr><tr><td>1<\/td><td>Enforce DoR on top 50 % stories; start GenAI tests (optional toggle)<\/td><\/tr><tr><td>2<\/td><td>Move all stories through Plan-Left column; enable dual-review rule<\/td><\/tr><tr><td>3<\/td><td>Activate Measure-Left dashboard; alert thresholds at yellow<\/td><\/tr><tr><td>4<\/td><td>Hold first \u201cPredictability Retro\u201d (look only at lead indicators)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After Sprint 4 most squads report 30\u201340 % drop in re-work hours and one less hot-fix per release.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Common Pushbacks &amp; Answers (120 w)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201cTests slow us down.\u201d<\/strong>\u2002Our GenAI scaffold adds 90 s per PR; re-work bugs cost hours.<br><\/li>\n\n\n\n<li><strong>\u201cWe can\u2019t write risk matrices for every story.\u201d<\/strong>\u2002Do it only for epics with \u22655 SP risk; copy labels to child stories.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u201cSBOM timeouts in CI.\u201d<\/strong>\u2002Cache node modules \/ Go cache; SBOM diff-only mode cuts 70 %.<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Real-World Impact: Wellness-App Case (110 w)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Before:<\/strong> 36 % of sprints carried rollover, 5 hot-fixes post-launch.<br><\/li>\n\n\n\n<li><strong>After Plan-Left:<\/strong> rollover 12 %.<br><\/li>\n\n\n\n<li><strong>After Code-Left &amp; Measure-Left:<\/strong> 0 hot-fixes; app-store approval first try.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Time saved: 2 engineer-weeks per quarter \u2192 re-invested in growth features.<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Takeaway Checklist (70 w)<\/strong><\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add Plan-Left column &amp; DoR.<br><\/li>\n\n\n\n<li>Enable GenAI test scaffold &amp; SBOM on PR.<br><\/li>\n\n\n\n<li>Track Risk-High WIP, TTF-Review, Coverage \u0394, SBOM penalty.<br><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Hold monthly predictability retro\u2014focus on lead indicators, not velocity excuses.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Ship predictably by moving planning, testing and metrics to the very start of every iteration. \u201cShift-Left\u201d dies in committees when it means \u201cQA starts earlier.\u201d Real shift-left moves planning, testing, metrics, and risk gates to the very start of every sprint. In this deep dive we unpack the Plan-Left \u2192 Code-Left \u2192 Measure-Left triangle we [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":15,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[11,10,9,14,13,12],"class_list":["post-14","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-shift-left-engineering","tag-ai","tag-chatgpt","tag-neural","tag-neuro","tag-programing","tag-robot"],"_links":{"self":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":12,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":32,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/posts\/14\/revisions\/32"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media\/15"}],"wp:attachment":[{"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/steadyrabbit.in\/blogs\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}