This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 720" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Цикл automated compatibility gate</title>
|
||||
<desc id="desc">Пять шагов проводят fixed schema case через явное сравнение, required surface, manifest и capability consumer. У каждой ошибки есть отдельная красная ветка возврата, положительная ветка заканчивается ограниченным synthetic hand-off.</desc>
|
||||
<defs>
|
||||
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||||
<path d="M0,0 L10,5 L0,10 z" fill="#24415d"/>
|
||||
</marker>
|
||||
<marker id="redArrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||||
<path d="M0,0 L10,5 L0,10 z" fill="#b23a48"/>
|
||||
</marker>
|
||||
<style>
|
||||
.bg { fill: #f6f8fb; }
|
||||
.step { fill: #ffffff; stroke: #24415d; stroke-width: 3; }
|
||||
.ok { fill: #e7f3ef; stroke: #237a57; stroke-width: 3; }
|
||||
.stop { fill: #fdecee; stroke: #b23a48; stroke-width: 3; }
|
||||
.line { stroke: #24415d; stroke-width: 4; fill: none; marker-end: url(#arrow); }
|
||||
.red { stroke: #b23a48; stroke-width: 3; fill: none; marker-end: url(#redArrow); }
|
||||
.title { font: 700 34px Arial, sans-serif; fill: #18324a; }
|
||||
.label { font: 700 22px Arial, sans-serif; fill: #18324a; }
|
||||
.text { font: 18px Arial, sans-serif; fill: #294860; }
|
||||
.good { font: 700 18px Arial, sans-serif; fill: #126244; }
|
||||
.bad { font: 700 16px Arial, sans-serif; fill: #8d2632; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="bg" width="960" height="720" rx="28"/>
|
||||
<text class="title" x="56" y="68">У каждого stop есть своя причина</text>
|
||||
|
||||
<rect class="step" x="58" y="142" width="164" height="126" rx="18"/>
|
||||
<text class="label" x="84" y="184">fixed case</text>
|
||||
<text class="text" x="84" y="216">baseline</text>
|
||||
<text class="text" x="84" y="242">candidate + reader</text>
|
||||
|
||||
<path class="line" d="M224 205 L286 205"/>
|
||||
<rect class="step" x="292" y="142" width="164" height="126" rx="18"/>
|
||||
<text class="label" x="318" y="184">relation</text>
|
||||
<text class="text" x="318" y="216">direction</text>
|
||||
<text class="text" x="318" y="242">family + versions</text>
|
||||
|
||||
<path class="line" d="M458 205 L520 205"/>
|
||||
<rect class="step" x="526" y="142" width="164" height="126" rx="18"/>
|
||||
<text class="label" x="552" y="184">schema diff</text>
|
||||
<text class="text" x="552" y="216">required fields</text>
|
||||
<text class="text" x="552" y="242">type changes</text>
|
||||
|
||||
<path class="line" d="M692 205 L754 205"/>
|
||||
<rect class="step" x="760" y="142" width="150" height="126" rx="18"/>
|
||||
<text class="label" x="784" y="184">manifest</text>
|
||||
<text class="text" x="784" y="216">declared</text>
|
||||
<text class="text" x="784" y="242">additions</text>
|
||||
|
||||
<path class="line" d="M835 270 L835 338"/>
|
||||
<rect class="step" x="742" y="344" width="168" height="126" rx="18"/>
|
||||
<text class="label" x="768" y="386">consumer</text>
|
||||
<text class="text" x="768" y="418">required fields</text>
|
||||
<text class="text" x="768" y="444">addition policy</text>
|
||||
|
||||
<path class="line" d="M740 407 L654 407"/>
|
||||
<rect class="ok" x="432" y="344" width="216" height="126" rx="18"/>
|
||||
<text class="good" x="458" y="388">SYNTHETIC</text>
|
||||
<text class="good" x="458" y="418">REVIEW HAND-OFF</text>
|
||||
<text class="text" x="458" y="446">no deploy effect</text>
|
||||
|
||||
<path class="red" d="M374 270 L374 330 L274 330 L274 518"/>
|
||||
<rect class="stop" x="58" y="522" width="206" height="112" rx="16"/>
|
||||
<text class="bad" x="80" y="560">implicit comparison</text>
|
||||
<text class="text" x="80" y="590">name relation</text>
|
||||
|
||||
<path class="red" d="M608 270 L608 518 L508 518"/>
|
||||
<rect class="stop" x="286" y="522" width="210" height="112" rx="16"/>
|
||||
<text class="bad" x="308" y="560">backward break</text>
|
||||
<text class="text" x="308" y="590">repair surface</text>
|
||||
|
||||
<path class="red" d="M836 270 L836 304 L724 304 L724 518"/>
|
||||
<rect class="stop" x="520" y="522" width="190" height="112" rx="16"/>
|
||||
<text class="bad" x="542" y="560">hidden field</text>
|
||||
<text class="text" x="542" y="590">repair manifest</text>
|
||||
|
||||
<path class="red" d="M826 470 L826 506 L826 518"/>
|
||||
<rect class="stop" x="734" y="522" width="176" height="112" rx="16"/>
|
||||
<text class="bad" x="756" y="560">strict reader</text>
|
||||
<text class="text" x="756" y="590">separate decision</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,66 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 720" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Эволюция fixed контракта данных через compatibility gate</title>
|
||||
<desc id="desc">Слева baseline schema версии 1.0, справа candidate schema версии 1.1 с полем priority. Между ними gate проверяет direction, manifest и consumer. Скрытое поле routingHint ведёт к отдельному stop.</desc>
|
||||
<defs>
|
||||
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||||
<path d="M0,0 L10,5 L0,10 z" fill="#24415d"/>
|
||||
</marker>
|
||||
<marker id="stopArrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
|
||||
<path d="M0,0 L10,5 L0,10 z" fill="#b23a48"/>
|
||||
</marker>
|
||||
<style>
|
||||
.bg { fill: #f6f8fb; }
|
||||
.card { fill: #ffffff; stroke: #24415d; stroke-width: 3; }
|
||||
.gate { fill: #e7f3ef; stroke: #237a57; stroke-width: 3; }
|
||||
.stop { fill: #fdecee; stroke: #b23a48; stroke-width: 3; }
|
||||
.line { stroke: #24415d; stroke-width: 4; fill: none; marker-end: url(#arrow); }
|
||||
.stop-line { stroke: #b23a48; stroke-width: 4; fill: none; marker-end: url(#stopArrow); }
|
||||
.title { font: 700 34px Arial, sans-serif; fill: #18324a; }
|
||||
.label { font: 700 24px Arial, sans-serif; fill: #18324a; }
|
||||
.text { font: 20px Arial, sans-serif; fill: #294860; }
|
||||
.small { font: 18px Arial, sans-serif; fill: #294860; }
|
||||
.good { font: 700 19px Arial, sans-serif; fill: #126244; }
|
||||
.bad { font: 700 18px Arial, sans-serif; fill: #8d2632; }
|
||||
.mono { font: 18px "Courier New", monospace; fill: #18324a; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="bg" width="960" height="720" rx="28"/>
|
||||
<text class="title" x="64" y="68">Изменение схемы — это пара reader и writer</text>
|
||||
|
||||
<rect class="card" x="56" y="128" width="232" height="360" rx="20"/>
|
||||
<text class="label" x="82" y="172">baseline v1.0</text>
|
||||
<text class="small" x="82" y="206">fixed-work-item</text>
|
||||
<line x1="82" y1="226" x2="260" y2="226" stroke="#b9cad8" stroke-width="2"/>
|
||||
<text class="mono" x="82" y="268">id: string *</text>
|
||||
<text class="mono" x="82" y="310">state: string *</text>
|
||||
<text class="mono" x="82" y="352">note: string</text>
|
||||
<text class="small" x="82" y="420">* required surface</text>
|
||||
<text class="small" x="82" y="452">reader knows this</text>
|
||||
|
||||
<path class="line" d="M290 308 C322 308 332 308 356 308"/>
|
||||
<rect class="gate" x="362" y="150" width="246" height="320" rx="20"/>
|
||||
<text class="label" x="392" y="194">compatibility gate</text>
|
||||
<line x1="392" y1="214" x2="578" y2="214" stroke="#91c9af" stroke-width="2"/>
|
||||
<text class="good" x="392" y="252">1. direction named</text>
|
||||
<text class="good" x="392" y="292">2. required stays</text>
|
||||
<text class="good" x="392" y="332">3. manifest matches</text>
|
||||
<text class="good" x="392" y="372">4. consumer accepts</text>
|
||||
<text class="small" x="392" y="426">output: review hand-off</text>
|
||||
|
||||
<path class="line" d="M610 308 C642 308 654 308 680 308"/>
|
||||
<rect class="card" x="686" y="128" width="220" height="360" rx="20"/>
|
||||
<text class="label" x="712" y="172">candidate v1.1</text>
|
||||
<text class="small" x="712" y="206">fixed-work-item</text>
|
||||
<line x1="712" y1="226" x2="878" y2="226" stroke="#b9cad8" stroke-width="2"/>
|
||||
<text class="mono" x="712" y="268">id: string *</text>
|
||||
<text class="mono" x="712" y="310">state: string *</text>
|
||||
<text class="mono" x="712" y="352">note: string</text>
|
||||
<text class="mono" x="712" y="394">priority: integer</text>
|
||||
<text class="good" x="712" y="448">declared addition</text>
|
||||
|
||||
<path class="stop-line" d="M796 492 C796 536 754 550 704 550 L610 550"/>
|
||||
<rect class="stop" x="274" y="530" width="330" height="126" rx="18"/>
|
||||
<text class="bad" x="302" y="574">routingHint вне manifest</text>
|
||||
<text class="bad" x="302" y="610">stop-undocumented-schema-field</text>
|
||||
<text class="small" x="302" y="638">сначала назвать или убрать поле</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,73 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 720" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Матрица compatibility review для producer и consumer</title>
|
||||
<desc id="desc">Таблица сравнивает fixed candidate changes и profiles consumer. Tolerant reader допускает объявленное поле priority, strict reader останавливает review, скрытое поле и неявное сравнение получают собственные статусы.</desc>
|
||||
<defs>
|
||||
<style>
|
||||
.bg { fill: #f6f8fb; }
|
||||
.header { fill: #24415d; }
|
||||
.rowhead { fill: #e8eef4; }
|
||||
.ok { fill: #e7f3ef; }
|
||||
.stop { fill: #fdecee; }
|
||||
.unknown { fill: #fff4d6; }
|
||||
.grid { stroke: #ffffff; stroke-width: 4; }
|
||||
.title { font: 700 34px Arial, sans-serif; fill: #18324a; }
|
||||
.head { font: 700 21px Arial, sans-serif; fill: #ffffff; }
|
||||
.label { font: 700 20px Arial, sans-serif; fill: #18324a; }
|
||||
.text { font: 18px Arial, sans-serif; fill: #294860; }
|
||||
.good { font: 700 18px Arial, sans-serif; fill: #126244; }
|
||||
.bad { font: 700 17px Arial, sans-serif; fill: #8d2632; }
|
||||
.warn { font: 700 17px Arial, sans-serif; fill: #9a6815; }
|
||||
</style>
|
||||
</defs>
|
||||
<rect class="bg" width="960" height="720" rx="28"/>
|
||||
<text class="title" x="56" y="68">Один schema diff не даёт один verdict</text>
|
||||
<text class="text" x="56" y="104">Статус живёт в пересечении named producer, change и capability reader.</text>
|
||||
|
||||
<rect class="header" x="56" y="154" width="266" height="92" rx="14"/>
|
||||
<rect class="header" x="326" y="154" width="190" height="92" rx="14"/>
|
||||
<rect class="header" x="520" y="154" width="190" height="92" rx="14"/>
|
||||
<rect class="header" x="714" y="154" width="190" height="92" rx="14"/>
|
||||
<text class="head" x="80" y="194">candidate change</text>
|
||||
<text class="head" x="80" y="222">и relation</text>
|
||||
<text class="head" x="348" y="194">tolerant</text>
|
||||
<text class="head" x="348" y="222">reader</text>
|
||||
<text class="head" x="544" y="194">strict</text>
|
||||
<text class="head" x="544" y="222">reader</text>
|
||||
<text class="head" x="738" y="194">unnamed</text>
|
||||
<text class="head" x="738" y="222">relation</text>
|
||||
|
||||
<rect class="rowhead" x="56" y="250" width="266" height="118" rx="14"/>
|
||||
<rect class="ok" x="326" y="250" width="190" height="118" rx="14"/>
|
||||
<rect class="stop" x="520" y="250" width="190" height="118" rx="14"/>
|
||||
<rect class="unknown" x="714" y="250" width="190" height="118" rx="14"/>
|
||||
<text class="label" x="80" y="290">v1.1 adds</text>
|
||||
<text class="label" x="80" y="318">priority (declared)</text>
|
||||
<text class="good" x="346" y="294">HAND-OFF</text>
|
||||
<text class="text" x="346" y="326">accepts additions</text>
|
||||
<text class="bad" x="542" y="294">STOP</text>
|
||||
<text class="bad" x="542" y="324">incompatible</text>
|
||||
<text class="warn" x="736" y="294">STOP</text>
|
||||
<text class="warn" x="736" y="324">implicit relation</text>
|
||||
|
||||
<rect class="rowhead" x="56" y="372" width="266" height="118" rx="14"/>
|
||||
<rect class="stop" x="326" y="372" width="190" height="118" rx="14"/>
|
||||
<rect class="stop" x="520" y="372" width="190" height="118" rx="14"/>
|
||||
<rect class="unknown" x="714" y="372" width="190" height="118" rx="14"/>
|
||||
<text class="label" x="80" y="412">v2 removes</text>
|
||||
<text class="label" x="80" y="440">required state</text>
|
||||
<text class="bad" x="346" y="416">STOP</text>
|
||||
<text class="bad" x="346" y="446">backward break</text>
|
||||
<text class="bad" x="542" y="416">STOP</text>
|
||||
<text class="bad" x="542" y="446">backward break</text>
|
||||
<text class="warn" x="736" y="416">NO REVIEW</text>
|
||||
<text class="warn" x="736" y="446">pair is unnamed</text>
|
||||
|
||||
<rect class="rowhead" x="56" y="494" width="266" height="118" rx="14"/>
|
||||
<rect class="stop" x="326" y="494" width="578" height="118" rx="14"/>
|
||||
<text class="label" x="80" y="534">v1.1 adds</text>
|
||||
<text class="label" x="80" y="562">routingHint (hidden)</text>
|
||||
<text class="bad" x="352" y="538">STOP — undocumented schema field</text>
|
||||
<text class="text" x="352" y="572">consumer policy cannot approve a field absent from manifest</text>
|
||||
|
||||
<text class="text" x="56" y="664">Зелёная ячейка не означает deploy: она передаёт только fixed synthetic compatibility review.</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
Reference in New Issue
Block a user