80 lines
5.1 KiB
XML
80 lines
5.1 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="1380" viewBox="0 0 720 1380" role="img" aria-labelledby="title desc">
|
||
<title id="title">Диагностика расхождения owner и проекции</title>
|
||
<desc id="desc">Вертикальная диагностическая схема собирает owner version, projection version, event id и compensation key. Затем отделяет version gap, конфликт одинаковой версии и повтор события; рискованный следующий шаг заблокирован до доказательств.</desc>
|
||
<defs>
|
||
<style>
|
||
.bg { fill: #0b1220; }
|
||
.frame { fill: #101c31; stroke: #2e4264; stroke-width: 3; }
|
||
.input { fill: #173954; stroke: #66c5f2; stroke-width: 3; }
|
||
.evidence { fill: #294050; stroke: #a8c8e7; stroke-width: 3; }
|
||
.decision { fill: #503b1b; stroke: #f6c45a; stroke-width: 3; }
|
||
.action { fill: #1d473e; stroke: #72d7b7; stroke-width: 3; }
|
||
.stop { fill: #552b35; stroke: #ff8992; stroke-width: 3; }
|
||
.title { fill: #f5f8ff; font: 700 32px Arial, sans-serif; }
|
||
.section { fill: #ffffff; font: 700 26px Arial, sans-serif; }
|
||
.copy { fill: #d9e5f5; font: 22px Arial, sans-serif; }
|
||
.small { fill: #b8cbe0; font: 20px Arial, sans-serif; }
|
||
.accent { fill: #8de0ff; font: 700 22px Arial, sans-serif; }
|
||
.arrow { fill: none; stroke: #8de0ff; stroke-width: 5; stroke-linecap: round; stroke-linejoin: round; marker-end: url(#arrowhead); }
|
||
.branch { fill: none; stroke: #f6c45a; stroke-width: 4; stroke-linecap: round; stroke-linejoin: round; marker-end: url(#yellowhead); }
|
||
</style>
|
||
<marker id="arrowhead" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||
<path d="M 0 0 L 10 5 L 0 10 z" fill="#8de0ff"/>
|
||
</marker>
|
||
<marker id="yellowhead" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||
<path d="M 0 0 L 10 5 L 0 10 z" fill="#f6c45a"/>
|
||
</marker>
|
||
</defs>
|
||
<rect class="bg" width="720" height="1380" rx="32"/>
|
||
<rect class="frame" x="34" y="30" width="652" height="104" rx="22"/>
|
||
<text class="title" x="62" y="73">Разные статусы одного заказа</text>
|
||
<text class="copy" x="62" y="108">Сначала блокируем effect, затем собираем evidence</text>
|
||
|
||
<rect class="stop" x="68" y="174" width="584" height="100" rx="20"/>
|
||
<text class="section" x="96" y="216">1. Не выполнять следующий effect</text>
|
||
<text class="copy" x="96" y="249">отгрузка, доступ или повторный reserve — paused</text>
|
||
<path class="arrow" d="M360 274 L360 312"/>
|
||
|
||
<rect class="evidence" x="68" y="322" width="584" height="188" rx="20"/>
|
||
<text class="section" x="96" y="366">2. Собрать evidence packet</text>
|
||
<text class="copy" x="96" y="403">owner state + version</text>
|
||
<text class="copy" x="96" y="434">projection state + version</text>
|
||
<text class="copy" x="96" y="465">source + event id + compensation key</text>
|
||
<text class="small" x="96" y="494">один object id, один момент наблюдения</text>
|
||
<path class="arrow" d="M360 510 L360 548"/>
|
||
|
||
<rect class="decision" x="68" y="558" width="584" height="122" rx="20"/>
|
||
<text class="section" x="96" y="602">3. Сравнить version</text>
|
||
<text class="accent" x="96" y="639">owner > projection, равно или event duplicate?</text>
|
||
|
||
<path class="branch" d="M236 680 L136 730 L136 762"/>
|
||
<path class="branch" d="M484 680 L584 730 L584 762"/>
|
||
<text class="small" x="82" y="724">gap</text>
|
||
<text class="small" x="548" y="724">same</text>
|
||
|
||
<rect class="action" x="44" y="772" width="296" height="176" rx="20"/>
|
||
<text class="section" x="72" y="816">4a. Version gap</text>
|
||
<text class="copy" x="72" y="853">найти missing event</text>
|
||
<text class="copy" x="72" y="883">или deferred record</text>
|
||
<text class="small" x="72" y="916">replay только по contract</text>
|
||
|
||
<rect class="input" x="380" y="772" width="296" height="176" rx="20"/>
|
||
<text class="section" x="408" y="816">4b. Version same</text>
|
||
<text class="copy" x="408" y="853">сверить transform rule</text>
|
||
<text class="copy" x="408" y="883">event ledger и effect</text>
|
||
<text class="small" x="408" y="916">не стирать ledger вслепую</text>
|
||
|
||
<path class="arrow" d="M192 948 L192 1000 L360 1000 L360 1038"/>
|
||
<path class="arrow" d="M528 948 L528 1000 L360 1000"/>
|
||
|
||
<rect class="evidence" x="68" y="1048" width="584" height="150" rx="20"/>
|
||
<text class="section" x="96" y="1092">5. Проверить компенсацию</text>
|
||
<text class="copy" x="96" y="1129">reason + исходная version + один key</text>
|
||
<text class="small" x="96" y="1160">key не доказывает внешний effect</text>
|
||
<path class="arrow" d="M360 1198 L360 1236"/>
|
||
|
||
<rect class="action" x="68" y="1246" width="584" height="96" rx="20"/>
|
||
<text class="section" x="96" y="1286">6. Выбрать контролируемое действие</text>
|
||
<text class="copy" x="96" y="1319">replay, correction с журналом или manual decision</text>
|
||
</svg>
|