syntaxai/tdd.md · main · public / images / git-url-postmortem-scorecard.svg
<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_<old>_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>