This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1280" viewBox="0 0 1200 1280" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Совместимость writer и reader для контракта profile.settings</title>
|
||||
<desc id="desc">Writer v1 и v2 записывают настройки профиля. Writer v2 добавляет необязательный timezone. Reader v1 игнорирует неизвестный optional ключ, reader v2 различает absent, null и строковое значение. Внизу показаны запрещённые сужение значений и смена смысла.</desc>
|
||||
<rect width="1200" height="1280" fill="#0b1220"/>
|
||||
<rect x="48" y="42" width="1104" height="108" rx="24" fill="#13233e" stroke="#5dd6ff" stroke-width="3"/>
|
||||
<text x="92" y="94" font-family="Arial, sans-serif" font-size="42" font-weight="700" fill="#f8fbff">Контракт profile.settings: совместимость</text>
|
||||
<text x="92" y="127" font-family="Arial, sans-serif" font-size="25" fill="#b7c9df">Проверяем конкретную пару writer → reader</text>
|
||||
<rect x="70" y="220" width="420" height="226" rx="22" fill="#1a304d" stroke="#72b9ff" stroke-width="3"/>
|
||||
<text x="104" y="274" font-family="Arial, sans-serif" font-size="35" font-weight="700" fill="#ffffff">writer v1</text>
|
||||
<text x="104" y="319" font-family="Arial, sans-serif" font-size="27" fill="#dcecff">id · name · settings</text>
|
||||
<text x="104" y="360" font-family="Arial, sans-serif" font-size="25" fill="#9ec6eb">timezone: absent</text>
|
||||
<text x="104" y="405" font-family="Arial, sans-serif" font-size="23" fill="#f9d889">digest: off / weekly / daily</text>
|
||||
<rect x="710" y="220" width="420" height="226" rx="22" fill="#173c39" stroke="#64e2b8" stroke-width="3"/>
|
||||
<text x="744" y="274" font-family="Arial, sans-serif" font-size="35" font-weight="700" fill="#ffffff">writer v2</text>
|
||||
<text x="744" y="319" font-family="Arial, sans-serif" font-size="27" fill="#d7fff0">тот же core</text>
|
||||
<text x="744" y="360" font-family="Arial, sans-serif" font-size="25" fill="#a4e4d0">+ optional timezone</text>
|
||||
<text x="744" y="405" font-family="Arial, sans-serif" font-size="23" fill="#f9d889">absent / null / string</text>
|
||||
<path d="M490 333 H690" stroke="#7ee5c5" stroke-width="8" fill="none" marker-end="url(#arrowGreen)"/>
|
||||
<text x="510" y="304" font-family="Arial, sans-serif" font-size="23" fill="#b9f3df">additive key</text>
|
||||
<rect x="70" y="560" width="420" height="244" rx="22" fill="#1b2c47" stroke="#84aefa" stroke-width="3"/>
|
||||
<text x="104" y="616" font-family="Arial, sans-serif" font-size="35" font-weight="700" fill="#ffffff">reader v1</text>
|
||||
<text x="104" y="662" font-family="Arial, sans-serif" font-size="26" fill="#dcecff">читает именованный core</text>
|
||||
<text x="104" y="703" font-family="Arial, sans-serif" font-size="25" fill="#b4c9e8">unknown optional: ignore</text>
|
||||
<text x="104" y="751" font-family="Arial, sans-serif" font-size="23" fill="#f9d889">timezone не required</text>
|
||||
<rect x="710" y="560" width="420" height="244" rx="22" fill="#16433b" stroke="#70e6be" stroke-width="3"/>
|
||||
<text x="744" y="616" font-family="Arial, sans-serif" font-size="35" font-weight="700" fill="#ffffff">reader v2</text>
|
||||
<text x="744" y="662" font-family="Arial, sans-serif" font-size="26" fill="#d7fff0">читает core + timezone</text>
|
||||
<text x="744" y="703" font-family="Arial, sans-serif" font-size="25" fill="#a4e4d0">absent ≠ null ≠ string</text>
|
||||
<text x="744" y="751" font-family="Arial, sans-serif" font-size="23" fill="#f9d889">старый record читаем</text>
|
||||
<path d="M280 446 V540" stroke="#75d9ff" stroke-width="8" fill="none" marker-end="url(#arrowBlue)"/>
|
||||
<path d="M920 446 V540" stroke="#7ee5c5" stroke-width="8" fill="none" marker-end="url(#arrowGreen)"/>
|
||||
<path d="M490 676 H690" stroke="#7ee5c5" stroke-width="8" fill="none" marker-end="url(#arrowGreen)"/>
|
||||
<text x="530" y="646" font-family="Arial, sans-serif" font-size="22" fill="#b9f3df">доказанная пара</text>
|
||||
<rect x="70" y="915" width="1060" height="280" rx="24" fill="#392432" stroke="#ff8fa4" stroke-width="3"/>
|
||||
<text x="108" y="970" font-family="Arial, sans-serif" font-size="34" font-weight="700" fill="#fff5f7">Красная граница: тест обязан остановить изменение</text>
|
||||
<circle cx="130" cy="1038" r="12" fill="#ff8fa4"/>
|
||||
<text x="164" y="1048" font-family="Arial, sans-serif" font-size="27" fill="#ffe0e6">narrowing: новый reader отвергает legacy значение daily</text>
|
||||
<circle cx="130" cy="1100" r="12" fill="#ff8fa4"/>
|
||||
<text x="164" y="1110" font-family="Arial, sans-serif" font-size="27" fill="#ffe0e6">semantic change: weekly остаётся строкой, но меняет смысл</text>
|
||||
<circle cx="130" cy="1162" r="12" fill="#ff8fa4"/>
|
||||
<text x="164" y="1172" font-family="Arial, sans-serif" font-size="27" fill="#ffe0e6">presence break: старому writer нельзя внезапно потребовать timezone</text>
|
||||
<defs>
|
||||
<marker id="arrowGreen" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0,0 L12,6 L0,12 z" fill="#7ee5c5"/></marker>
|
||||
<marker id="arrowBlue" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0,0 L12,6 L0,12 z" fill="#75d9ff"/></marker>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
Reference in New Issue
Block a user