syntaxai/tdd.md · main · public / images / git-url-postmortem-scorecard.svg

git-url-postmortem-scorecard.svg 106 lines · 5457 bytes raw
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 700" width="1200" height="700">
  <rect width="1200" height="700" fill="#0a0a0a"/>

  <!-- Header -->
  <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace">
    <text x="80" y="46" font-size="20" font-weight="600" fill="#909090">Plan vs actual — /GIT/ URL refactor postmortem</text>
    <text x="80" y="92" font-size="32" font-weight="700" fill="#e8e8e8">The plan held. 19 files, one regex, zero regressions.</text>
    <text x="80" y="120" font-size="14" fill="#7a7a7a">PR #42 · commit df9d41a · 153 insertions, 69 deletions · 9 new helper tests · 7/7 ✓ before and after</text>
  </g>

  <!-- Column headers -->
  <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace" font-size="13" font-weight="600" letter-spacing="2">
    <text x="100" y="172" fill="#909090">CLAUSE</text>
    <text x="600" y="172" fill="#909090">PREDICTED</text>
    <text x="820" y="172" fill="#909090">ACTUAL</text>
    <text x="1020" y="172" fill="#909090">VERDICT</text>
  </g>
  <line x1="80" y1="184" x2="1120" y2="184" stroke="#2a2a2a" stroke-width="1"/>

  <!-- Rows -->
  <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace" font-size="15">

    <!-- row 1: source files -->
    <text x="100" y="216" fill="#c8c8c8">source files touched</text>
    <text x="600" y="216" fill="#8a8a8a">~10 + helper + test</text>
    <text x="820" y="216" fill="#c8c8c8">11 (incl. b32 + test)</text>
    <text x="1020" y="216" fill="#7ec77e">✓ on target</text>

    <!-- row 2: content files -->
    <text x="100" y="246" fill="#c8c8c8">content files rewritten</text>
    <text x="600" y="246" fill="#8a8a8a">8 (plan listed each)</text>
    <text x="820" y="246" fill="#c8c8c8">8</text>
    <text x="1020" y="246" fill="#7ec77e">✓ exact</text>

    <!-- row 3: references -->
    <text x="100" y="276" fill="#c8c8c8">/GIT/ references absorbed</text>
    <text x="600" y="276" fill="#8a8a8a">49</text>
    <text x="820" y="276" fill="#c8c8c8">49</text>
    <text x="1020" y="276" fill="#7ec77e">✓ exact</text>

    <!-- row 4: regex -->
    <text x="100" y="306" fill="#c8c8c8">redirect mechanism</text>
    <text x="600" y="306" fill="#8a8a8a">one regex</text>
    <text x="820" y="306" fill="#c8c8c8">one regex</text>
    <text x="1020" y="306" fill="#7ec77e">✓ anti-fudge held</text>

    <!-- row 5: helper LOC -->
    <text x="100" y="336" fill="#c8c8c8">Layer 1 helper size</text>
    <text x="600" y="336" fill="#8a8a8a">~5 lines</text>
    <text x="820" y="336" fill="#c8c8c8">13 lines</text>
    <text x="1020" y="336" fill="#7ec77e">✓ in band</text>

    <!-- row 6: helper test cases -->
    <text x="100" y="366" fill="#c8c8c8">helper test cases</text>
    <text x="600" y="366" fill="#8a8a8a">~3</text>
    <text x="820" y="366" fill="#c8c8c8">9</text>
    <text x="1020" y="366" fill="#c89a3a">~ over-covered (3×)</text>

    <!-- row 7: test count -->
    <text x="100" y="396" fill="#c8c8c8">total test count</text>
    <text x="600" y="396" fill="#8a8a8a">379 → 379+</text>
    <text x="820" y="396" fill="#c8c8c8">379 → 388 (+9)</text>
    <text x="1020" y="396" fill="#7ec77e">✓ green</text>

    <!-- row 8: verifier -->
    <text x="100" y="426" fill="#c8c8c8">/sama/v2/verify</text>
    <text x="600" y="426" fill="#8a8a8a">7/7 ✓ before + after</text>
    <text x="820" y="426" fill="#c8c8c8">7/7 ✓ before + after</text>
    <text x="1020" y="426" fill="#7ec77e">✓ verdict held</text>

    <!-- row 9: LIVE_REPO_OWNER -->
    <text x="100" y="456" fill="#c8c8c8">LIVE_REPO_OWNER constant</text>
    <text x="600" y="456" fill="#8a8a8a">stays exported</text>
    <text x="820" y="456" fill="#c8c8c8">stays exported</text>
    <text x="1020" y="456" fill="#7ec77e">✓ no scope creep</text>

    <!-- row 10: git protocol URLs -->
    <text x="100" y="486" fill="#c8c8c8">git protocol URLs</text>
    <text x="600" y="486" fill="#8a8a8a">untouched (scope-out)</text>
    <text x="820" y="486" fill="#c8c8c8">untouched</text>
    <text x="1020" y="486" fill="#7ec77e">✓ no breakage</text>

    <!-- row 11: alias mode -->
    <text x="100" y="516" fill="#c8c8c8">alias mode (both URLs work)</text>
    <text x="600" y="516" fill="#8a8a8a">forbidden — 301 only</text>
    <text x="820" y="516" fill="#c8c8c8">301 only</text>
    <text x="1020" y="516" fill="#7ec77e">✓ converges</text>

    <!-- row 12: surprises -->
    <text x="100" y="546" fill="#c8c8c8">unanticipated surprises</text>
    <text x="600" y="546" fill="#8a8a8a">(unknown)</text>
    <text x="820" y="546" fill="#c8c8c8">1 (commit-test churn)</text>
    <text x="1020" y="546" fill="#c89a3a">~ minor scope nit</text>
  </g>

  <!-- Footer: takeaway -->
  <rect x="80" y="582" width="1040" height="74" fill="#0f1a0f" stroke="#1f3f1f" stroke-width="1" rx="6"/>
  <g font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace">
    <text x="100" y="610" font-size="16" font-weight="600" fill="#7ec77e">The reusable shape:</text>
    <text x="100" y="634" font-size="14" fill="#c8c8c8">b32_&lt;old&gt;_url_redirect.ts (pure transform, ~5–13 lines) + sibling test + one Layer-3 wrapper in the fallback handler</text>
  </g>

  <!-- Watermark -->
  <text x="1120" y="684" text-anchor="end" font-family="ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace" font-size="12" fill="#5a5a5a">https://tdd.md</text>
</svg>