docs: add architecture and veins documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

- System overview, artery hierarchy, build flow, room config diagrams
- Veins docs: Jira, Slack, Google OAuth
- Shunts docs: MercadoPago mock
- DOT source files with generated SVGs
- HTML viewers with navigation and full-screen mode

Solves:
- Freelance work standardization
- Missing infrastructure replication (shunts)
- Reliable testing environment (BDD -> Gherkin -> Tests)
This commit is contained in:
buenosairesam
2026-01-02 22:09:13 -03:00
parent 05e7ead081
commit 22356fed66
22 changed files with 2887 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.1 (0)
-->
<!-- Title: MercadoPagoShunt Pages: 1 -->
<svg width="931pt" height="240pt"
viewBox="0.00 0.00 931.00 240.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 235.5)">
<title>MercadoPagoShunt</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-235.5 926.75,-235.5 926.75,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="461.38" y="-212.3" font-family="Helvetica,sans-Serif" font-size="16.00">MercadoPago Shunt &#45; Mock Payment Flow</text>
<g id="clust1" class="cluster">
<title>cluster_client</title>
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="5.25,-16 5.25,-96 252.25,-96 252.25,-16 5.25,-16"/>
<text xml:space="preserve" text-anchor="middle" x="128.75" y="-76.8" font-family="Helvetica,sans-Serif" font-size="16.00">Managed Room (e.g., AMAR)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_shunt</title>
<polygon fill="#fff3e0" stroke="#fff3e0" points="365.25,-13 365.25,-159 691.5,-159 691.5,-13 365.25,-13"/>
<text xml:space="preserve" text-anchor="middle" x="528.38" y="-139.8" font-family="Helvetica,sans-Serif" font-size="16.00">Shunt (artery/shunts/mercadopago)</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_responses</title>
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="712.5,-8 712.5,-196 922.75,-196 922.75,-8 712.5,-8"/>
<text xml:space="preserve" text-anchor="middle" x="817.62" y="-176.8" font-family="Helvetica,sans-Serif" font-size="16.00">Configurable Responses</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_real</title>
<polygon fill="none" stroke="#bdbdbd" stroke-dasharray="5,2" points="0,-105 0,-185 257.5,-185 257.5,-105 0,-105"/>
<text xml:space="preserve" text-anchor="middle" x="128.75" y="-165.8" font-family="Helvetica,sans-Serif" font-size="16.00">Real MercadoPago (bypassed)</text>
</g>
<!-- backend -->
<g id="node1" class="node">
<title>backend</title>
<path fill="#c8e6c9" stroke="black" d="M169.62,-60C169.62,-60 86.88,-60 86.88,-60 80.88,-60 74.88,-54 74.88,-48 74.88,-48 74.88,-36 74.88,-36 74.88,-30 80.88,-24 86.88,-24 86.88,-24 169.62,-24 169.62,-24 175.62,-24 181.62,-30 181.62,-36 181.62,-36 181.62,-48 181.62,-48 181.62,-54 175.62,-60 169.62,-60"/>
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-45.05" font-family="Helvetica,sans-Serif" font-size="11.00">Backend</text>
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-31.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Django/FastAPI)</text>
</g>
<!-- mock_api -->
<g id="node2" class="node">
<title>mock_api</title>
<path fill="#ffcc80" stroke="black" d="M454.88,-69.25C454.88,-69.25 393.88,-69.25 393.88,-69.25 387.88,-69.25 381.88,-63.25 381.88,-57.25 381.88,-57.25 381.88,-32.75 381.88,-32.75 381.88,-26.75 387.88,-20.75 393.88,-20.75 393.88,-20.75 454.88,-20.75 454.88,-20.75 460.88,-20.75 466.88,-26.75 466.88,-32.75 466.88,-32.75 466.88,-57.25 466.88,-57.25 466.88,-63.25 460.88,-69.25 454.88,-69.25"/>
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-54.8" font-family="Helvetica,sans-Serif" font-size="11.00">Mock API</text>
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-41.3" font-family="Helvetica,sans-Serif" font-size="11.00">/payments</text>
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-27.8" font-family="Helvetica,sans-Serif" font-size="11.00">/preferences</text>
</g>
<!-- backend&#45;&gt;mock_api -->
<g id="edge1" class="edge">
<title>backend&#45;&gt;mock_api</title>
<path fill="none" stroke="black" d="M181.83,-42.54C235.1,-43.08 317.03,-43.92 370.43,-44.46"/>
<polygon fill="black" stroke="black" points="370.15,-47.96 380.18,-44.56 370.22,-40.96 370.15,-47.96"/>
<text xml:space="preserve" text-anchor="middle" x="311.38" y="-47.53" font-family="Helvetica,sans-Serif" font-size="10.00">POST /payments</text>
</g>
<!-- mock_api&#45;&gt;backend -->
<g id="edge7" class="edge">
<title>mock_api&#45;&gt;backend</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M381.55,-32.32C372.93,-30.21 363.86,-28.35 355.25,-27.25 300.78,-20.27 238.48,-25.3 193.1,-31.31"/>
<polygon fill="black" stroke="black" points="192.87,-27.8 183.44,-32.64 193.83,-34.74 192.87,-27.8"/>
<text xml:space="preserve" text-anchor="middle" x="311.38" y="-30.5" font-family="Helvetica,sans-Serif" font-size="10.00">webhook callback</text>
</g>
<!-- state -->
<g id="node4" class="node">
<title>state</title>
<path fill="#ffa726" stroke="black" d="M671.5,-106C671.5,-106 568.5,-106 568.5,-106 562.5,-106 556.5,-100 556.5,-94 556.5,-94 556.5,-82 556.5,-82 556.5,-76 562.5,-70 568.5,-70 568.5,-70 671.5,-70 671.5,-70 677.5,-70 683.5,-76 683.5,-82 683.5,-82 683.5,-94 683.5,-94 683.5,-100 677.5,-106 671.5,-106"/>
<text xml:space="preserve" text-anchor="middle" x="620" y="-91.05" font-family="Helvetica,sans-Serif" font-size="11.00">State</text>
<text xml:space="preserve" text-anchor="middle" x="620" y="-77.55" font-family="Helvetica,sans-Serif" font-size="11.00">(pending payments)</text>
</g>
<!-- mock_api&#45;&gt;state -->
<g id="edge2" class="edge">
<title>mock_api&#45;&gt;state</title>
<path fill="none" stroke="black" d="M466.91,-54.22C489.66,-59.28 518.54,-65.69 545.01,-71.57"/>
<polygon fill="black" stroke="black" points="544.18,-74.97 554.7,-73.72 545.69,-68.14 544.18,-74.97"/>
<text xml:space="preserve" text-anchor="middle" x="516" y="-72.32" font-family="Helvetica,sans-Serif" font-size="10.00">store</text>
</g>
<!-- config_ui -->
<g id="node3" class="node">
<title>config_ui</title>
<path fill="#ffb74d" stroke="black" d="M463.5,-123C463.5,-123 385.25,-123 385.25,-123 379.25,-123 373.25,-117 373.25,-111 373.25,-111 373.25,-99 373.25,-99 373.25,-93 379.25,-87 385.25,-87 385.25,-87 463.5,-87 463.5,-87 469.5,-87 475.5,-93 475.5,-99 475.5,-99 475.5,-111 475.5,-111 475.5,-117 469.5,-123 463.5,-123"/>
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-108.05" font-family="Helvetica,sans-Serif" font-size="11.00">Config UI</text>
<text xml:space="preserve" text-anchor="middle" x="424.38" y="-94.55" font-family="Helvetica,sans-Serif" font-size="11.00">(set responses)</text>
</g>
<!-- config_ui&#45;&gt;state -->
<g id="edge3" class="edge">
<title>config_ui&#45;&gt;state</title>
<path fill="none" stroke="black" d="M475.99,-100.56C496.99,-98.71 521.76,-96.54 544.75,-94.52"/>
<polygon fill="black" stroke="black" points="545.05,-98.01 554.7,-93.65 544.44,-91.03 545.05,-98.01"/>
<text xml:space="preserve" text-anchor="middle" x="516" y="-102.27" font-family="Helvetica,sans-Serif" font-size="10.00">configure</text>
</g>
<!-- approved -->
<g id="node5" class="node">
<title>approved</title>
<path fill="#c8e6c9" stroke="black" d="M839,-160C839,-160 795.25,-160 795.25,-160 789.25,-160 783.25,-154 783.25,-148 783.25,-148 783.25,-136 783.25,-136 783.25,-130 789.25,-124 795.25,-124 795.25,-124 839,-124 839,-124 845,-124 851,-130 851,-136 851,-136 851,-148 851,-148 851,-154 845,-160 839,-160"/>
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-138.3" font-family="Helvetica,sans-Serif" font-size="11.00">approved</text>
</g>
<!-- state&#45;&gt;approved -->
<g id="edge4" class="edge">
<title>state&#45;&gt;approved</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M682.45,-106.43C692.47,-109.35 702.77,-112.3 712.5,-115 731.93,-120.4 753.5,-126.07 771.91,-130.81"/>
<polygon fill="black" stroke="black" points="770.9,-134.17 781.45,-133.26 772.64,-127.38 770.9,-134.17"/>
</g>
<!-- pending -->
<g id="node6" class="node">
<title>pending</title>
<path fill="#fff9c4" stroke="black" d="M834.88,-106C834.88,-106 799.38,-106 799.38,-106 793.38,-106 787.38,-100 787.38,-94 787.38,-94 787.38,-82 787.38,-82 787.38,-76 793.38,-70 799.38,-70 799.38,-70 834.88,-70 834.88,-70 840.88,-70 846.88,-76 846.88,-82 846.88,-82 846.88,-94 846.88,-94 846.88,-100 840.88,-106 834.88,-106"/>
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-84.3" font-family="Helvetica,sans-Serif" font-size="11.00">pending</text>
</g>
<!-- state&#45;&gt;pending -->
<g id="edge5" class="edge">
<title>state&#45;&gt;pending</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M683.81,-88C713.99,-88 749.28,-88 775.82,-88"/>
<polygon fill="black" stroke="black" points="775.47,-91.5 785.47,-88 775.47,-84.5 775.47,-91.5"/>
</g>
<!-- rejected -->
<g id="node7" class="node">
<title>rejected</title>
<path fill="#ffcdd2" stroke="black" d="M835.62,-52C835.62,-52 798.62,-52 798.62,-52 792.62,-52 786.62,-46 786.62,-40 786.62,-40 786.62,-28 786.62,-28 786.62,-22 792.62,-16 798.62,-16 798.62,-16 835.62,-16 835.62,-16 841.62,-16 847.62,-22 847.62,-28 847.62,-28 847.62,-40 847.62,-40 847.62,-46 841.62,-52 835.62,-52"/>
<text xml:space="preserve" text-anchor="middle" x="817.12" y="-30.3" font-family="Helvetica,sans-Serif" font-size="11.00">rejected</text>
</g>
<!-- state&#45;&gt;rejected -->
<g id="edge6" class="edge">
<title>state&#45;&gt;rejected</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M682.45,-69.57C692.47,-66.65 702.77,-63.7 712.5,-61 733.07,-55.29 756.03,-49.27 775.1,-44.37"/>
<polygon fill="black" stroke="black" points="775.84,-47.79 784.66,-41.92 774.11,-41.01 775.84,-47.79"/>
</g>
<!-- real_api -->
<g id="node8" class="node">
<title>real_api</title>
<path fill="#e0e0e0" stroke="black" d="M185.38,-149C185.38,-149 71.12,-149 71.12,-149 65.12,-149 59.12,-143 59.12,-137 59.12,-137 59.12,-125 59.12,-125 59.12,-119 65.12,-113 71.12,-113 71.12,-113 185.38,-113 185.38,-113 191.38,-113 197.38,-119 197.38,-125 197.38,-125 197.38,-137 197.38,-137 197.38,-143 191.38,-149 185.38,-149"/>
<text xml:space="preserve" text-anchor="middle" x="128.25" y="-127.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#9e9e9e">api.mercadopago.com</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB