rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s

This commit is contained in:
2026-07-31 22:26:56 +03:00
parent 3bfc3f21c4
commit 440c8721dc
69 changed files with 4424 additions and 3533 deletions
@@ -1,7 +1,39 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="590" viewBox="0 0 720 590" role="img" aria-labelledby="title desc">
<title id="title">Матрица обязанностей контракта</title><desc id="desc">Четыре строки различают query, command, read model и problem envelope. Красная нижняя строка запрещает доменный вывод из отправленной команды.</desc>
<rect width="720" height="590" fill="#f8fafc"/><text x="34" y="48" font-family="Arial,sans-serif" font-size="28" font-weight="700" fill="#152238">Boundary: право на вывод</text>
<rect x="32" y="82" width="656" height="54" fill="#173a78"/><text x="52" y="118" font-family="Arial,sans-serif" font-size="23" font-weight="700" fill="#fff">Форма</text><text x="246" y="118" font-family="Arial,sans-serif" font-size="23" font-weight="700" fill="#fff">Даёт UI</text><text x="500" y="118" font-family="Arial,sans-serif" font-size="23" font-weight="700" fill="#fff">Не даёт UI</text>
<g font-family="Arial,sans-serif" font-size="22" fill="#152238"><rect x="32" y="136" width="656" height="76" fill="#e8f0fe"/><text x="52" y="182">query</text><text x="246" y="182">вопрос к model</text><text x="500" y="182">изменение domain</text><rect x="32" y="212" width="656" height="76" fill="#eef7e9"/><text x="52" y="258">command</text><text x="246" y="258">intent</text><text x="500" y="258">успешный факт</text><rect x="32" y="288" width="656" height="76" fill="#fff3df"/><text x="52" y="334">read model</text><text x="246" y="334">status + actions</text><text x="500" y="334">скрытую причину</text><rect x="32" y="364" width="656" height="76" fill="#f2edfb"/><text x="52" y="410">problem</text><text x="246" y="410">code + retry</text><text x="500" y="410">догадку о retry</text></g>
<rect x="32" y="472" width="656" height="74" rx="12" fill="#fce8ea" stroke="#b3263a" stroke-width="3"/><text x="52" y="518" font-family="Arial,sans-serif" font-size="23" font-weight="700" fill="#8a1f2d">Отправка command ≠ новый domain fact</text><text x="34" y="574" font-family="Arial,sans-serif" font-size="19" fill="#526273">Матрица для plan review; не описание реального API.</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 420" role="img" aria-labelledby="title desc">
<title id="title">HTTP результат и следующий шаг UI</title>
<desc id="desc">Таблица-схема связывает 2xx, 409 и 422, 429 и 5xx с разрешённым действием интерфейса и показывает, что отправка команды сама по себе не меняет модель экрана.</desc>
<rect width="720" height="420" rx="24" fill="#f7f3ea"/>
<g font-family="Arial, sans-serif" fill="#202124">
<text x="42" y="48" font-size="24" font-weight="700">Статус задаёт ветку, не весь смысл</text>
<text x="42" y="75" font-size="16" fill="#5f6368">каждому результату — свой следующий шаг</text>
<g font-size="16" font-weight="700">
<rect x="42" y="112" width="118" height="48" rx="8" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<rect x="178" y="112" width="206" height="48" rx="8" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<rect x="402" y="112" width="250" height="48" rx="8" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<text x="101" y="143" text-anchor="middle">результат</text>
<text x="281" y="143" text-anchor="middle">что известно</text>
<text x="527" y="143" text-anchor="middle">следующий шаг UI</text>
</g>
<g font-size="16">
<rect x="42" y="174" width="118" height="42" rx="8" fill="#d9f1e1" stroke="#2e7d51" stroke-width="2"/>
<rect x="178" y="174" width="206" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<rect x="402" y="174" width="250" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<text x="101" y="201" text-anchor="middle" font-weight="700">200 + JSON</text>
<text x="192" y="201">valid representation</text>
<text x="416" y="201">render from model</text>
<rect x="42" y="224" width="118" height="42" rx="8" fill="#fff1cf" stroke="#a87400" stroke-width="2"/>
<rect x="178" y="224" width="206" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<rect x="402" y="224" width="250" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<text x="101" y="251" text-anchor="middle" font-weight="700">409 / 422</text>
<text x="192" y="251">domain rejection</text>
<text x="416" y="251">show reason or refetch</text>
<rect x="42" y="274" width="118" height="42" rx="8" fill="#fff1cf" stroke="#a87400" stroke-width="2"/>
<rect x="178" y="274" width="206" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<rect x="402" y="274" width="250" height="42" rx="8" fill="#fff" stroke="#b7b7b7"/>
<text x="101" y="301" text-anchor="middle" font-weight="700">429 / 5xx</text>
<text x="192" y="301">temporary failure</text>
<text x="416" y="301">bounded retry policy</text>
</g>
<rect x="42" y="344" width="610" height="42" rx="10" fill="#ffe2dc" stroke="#b84b3b" stroke-width="2"/>
<text x="347" y="371" text-anchor="middle" font-size="17" font-weight="700">command sent ≠ screen state changed: read the next model</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,9 +1,39 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="610" viewBox="0 0 720 610" role="img" aria-labelledby="title desc">
<title id="title">Цикл evidence для synthetic hand-off</title><desc id="desc">Пять шагов соединяют fixed literal, проверку ownership, stop или counterexample, уточнённый literal и ограниченный synthetic hand-off. Красная ветка возвращает domain claim к read model.</desc>
<defs><marker id="b" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0L10 5L0 10Z" fill="#1f4b99"/></marker><marker id="r" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0L10 5L0 10Z" fill="#b3263a"/></marker></defs>
<rect width="720" height="610" fill="#f8fafc"/><text x="34" y="46" font-family="Arial,sans-serif" font-size="28" font-weight="700" fill="#152238">Synthetic evidence loop</text>
<g font-family="Arial,sans-serif" font-size="23" text-anchor="middle"><rect x="50" y="115" width="180" height="74" rx="14" fill="#e8f0fe" stroke="#3566b8" stroke-width="3"/><text x="140" y="160" fill="#173a78">fixed literal</text><rect x="270" y="115" width="180" height="74" rx="14" fill="#eef7e9" stroke="#4d8b44" stroke-width="3"/><text x="360" y="160" fill="#245b2e">ownership check</text><rect x="490" y="115" width="180" height="74" rx="14" fill="#fff3df" stroke="#b67617" stroke-width="3"/><text x="580" y="160" fill="#824c00">named result</text><rect x="490" y="335" width="180" height="74" rx="14" fill="#eaf5f7" stroke="#257184" stroke-width="3"/><text x="580" y="380" fill="#1d5c6a">review hand-off</text><rect x="270" y="335" width="180" height="74" rx="14" fill="#f2edfb" stroke="#7051a8" stroke-width="3"/><text x="360" y="380" fill="#553885">new literal</text></g>
<path d="M230 152H270M450 152H490M580 189V335M490 372H450M270 372H140V189" fill="none" stroke="#1f4b99" stroke-width="5" marker-end="url(#b)"/>
<path d="M580 189V260H190V190" fill="none" stroke="#b3263a" stroke-width="5" marker-end="url(#r)"/><text x="288" y="246" font-family="Arial,sans-serif" font-size="22" font-weight="700" fill="#8a1f2d">domain claim → stop → read question</text>
<text x="34" y="510" font-family="Arial,sans-serif" font-size="21" fill="#526273">Positive output: только review hand-off.</text><text x="34" y="546" font-family="Arial,sans-serif" font-size="21" fill="#526273">productionEffect: not-attempted</text><text x="34" y="582" font-family="Arial,sans-serif" font-size="19" fill="#526273">Нет UI trace, сети, файлов или секретов.</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 420" role="img" aria-labelledby="title desc">
<title id="title">Диагностика рассинхрона UI и API</title>
<desc id="desc">Четыре наблюдения сравниваются последовательно: намерение, запрос, ответ и вход в рендер. Несовпадение ведёт к проверке соответствующей границы.</desc>
<rect width="720" height="420" rx="24" fill="#f7f3ea"/>
<g font-family="Arial, sans-serif" fill="#202124">
<text x="42" y="48" font-size="24" font-weight="700">Сравниваем соседние границы</text>
<text x="42" y="76" font-size="16" fill="#5f6368">intent → request → response → render input</text>
<g font-size="17" font-weight="700">
<circle cx="120" cy="184" r="54" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="3"/>
<circle cx="290" cy="184" r="54" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="3"/>
<circle cx="460" cy="184" r="54" fill="#d9f1e1" stroke="#2e7d51" stroke-width="3"/>
<circle cx="630" cy="184" r="54" fill="#d9f1e1" stroke="#2e7d51" stroke-width="3"/>
<text x="120" y="178" text-anchor="middle">intent</text>
<text x="120" y="201" text-anchor="middle">action</text>
<text x="290" y="178" text-anchor="middle">request</text>
<text x="290" y="201" text-anchor="middle">HTTP</text>
<text x="460" y="178" text-anchor="middle">response</text>
<text x="460" y="201" text-anchor="middle">contract</text>
<text x="630" y="178" text-anchor="middle">render</text>
<text x="630" y="201" text-anchor="middle">input</text>
</g>
<g stroke="#2b5f9e" stroke-width="3" fill="none">
<path d="M174 184h62m170 0h62m170 0h2"/>
<path d="m226 177 10 7-10 7m170-7 10 7-10 7m164-7 10 7-10 7"/>
</g>
<g font-size="16">
<rect x="104" y="292" width="152" height="58" rx="12" fill="#fff" stroke="#b7b7b7"/>
<rect x="284" y="292" width="152" height="58" rx="12" fill="#fff" stroke="#b7b7b7"/>
<rect x="464" y="292" width="152" height="58" rx="12" fill="#ffe2dc" stroke="#b84b3b" stroke-width="2"/>
<text x="180" y="317" text-anchor="middle">mapping формы</text>
<text x="180" y="338" text-anchor="middle">и безопасный input</text>
<text x="360" y="317" text-anchor="middle">route, status,</text>
<text x="360" y="338" text-anchor="middle">Content-Type</text>
<text x="540" y="317" text-anchor="middle">stale state,</text>
<text x="540" y="338" text-anchor="middle">selector или race</text>
</g>
<text x="42" y="392" font-size="15" fill="#5f6368">Снимок одного слоя не доказывает причину расхождения в другом.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,9 +1,35 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="620" viewBox="0 0 720 620" role="img" aria-labelledby="title desc">
<title id="title">Карта владельцев состояния</title><desc id="desc">Три колонки разделяют локальное состояние UI, контекст и API read model. Команда направлена к API, доменный факт не находится в UI.</desc>
<defs><marker id="a" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto"><path d="M0 0L10 5L0 10Z" fill="#1f4b99"/></marker></defs>
<rect width="720" height="620" fill="#f8fafc"/><text x="36" y="48" font-family="Arial,sans-serif" font-size="28" font-weight="700" fill="#152238">Карта владельцев: план на сентябрь</text>
<rect x="32" y="90" width="198" height="390" rx="16" fill="#e8f0fe" stroke="#3566b8" stroke-width="3"/><text x="52" y="132" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#173a78">UI</text><text x="52" y="182" font-family="Arial,sans-serif" font-size="23" fill="#152238">draft-filter</text><text x="52" y="225" font-family="Arial,sans-serif" font-size="23" fill="#152238">open-panel</text><text x="52" y="388" font-family="Arial,sans-serif" font-size="21" fill="#8a1f2d">не владеет</text><text x="52" y="420" font-family="Arial,sans-serif" font-size="21" fill="#8a1f2d">domain fact</text>
<rect x="261" y="90" width="198" height="390" rx="16" fill="#eef7e9" stroke="#4d8b44" stroke-width="3"/><text x="281" y="132" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#245b2e">Context</text><text x="281" y="182" font-family="Arial,sans-serif" font-size="23" fill="#152238">fixed-locale</text><text x="281" y="225" font-family="Arial,sans-serif" font-size="23" fill="#152238">permission</text><text x="281" y="388" font-family="Arial,sans-serif" font-size="21" fill="#3d6a35">условие</text><text x="281" y="420" font-family="Arial,sans-serif" font-size="21" fill="#3d6a35">интерпретации</text>
<rect x="490" y="90" width="198" height="390" rx="16" fill="#fff3df" stroke="#b67617" stroke-width="3"/><text x="510" y="132" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#824c00">API</text><text x="510" y="182" font-family="Arial,sans-serif" font-size="23" fill="#152238">status</text><text x="510" y="225" font-family="Arial,sans-serif" font-size="23" fill="#152238">allowedActions</text><text x="510" y="268" font-family="Arial,sans-serif" font-size="23" fill="#152238">messageCode</text><text x="510" y="388" font-family="Arial,sans-serif" font-size="21" fill="#824c00">read model</text><text x="510" y="420" font-family="Arial,sans-serif" font-size="21" fill="#824c00">и problem</text>
<line x1="190" y1="535" x2="530" y2="535" stroke="#1f4b99" stroke-width="5" marker-end="url(#a)"/><text x="270" y="516" font-family="Arial,sans-serif" font-size="22" font-weight="700" fill="#1f4b99">command intent</text><text x="36" y="582" font-family="Arial,sans-serif" font-size="20" fill="#526273">Fixed synthetic model; не trace и не факт системы.</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 420" role="img" aria-labelledby="title desc">
<title id="title">Проверка ответа перед рендером</title>
<desc id="desc">Последовательность из HTTP status, Content-Type, JSON parse, screen model validator и рендера. Ошибка контракта ведёт в отдельную ветку остановки.</desc>
<rect width="720" height="420" rx="24" fill="#f7f3ea"/>
<g font-family="Arial, sans-serif" fill="#202124">
<text x="42" y="48" font-size="24" font-weight="700">До рендера доходят только проверенные данные</text>
<text x="42" y="76" font-size="16" fill="#5f6368">transport → format → shape → view</text>
<g font-size="17" font-weight="700">
<rect x="42" y="132" width="112" height="76" rx="12" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<text x="98" y="163" text-anchor="middle">HTTP</text>
<text x="98" y="188" text-anchor="middle">status</text>
<rect x="178" y="132" width="112" height="76" rx="12" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<text x="234" y="163" text-anchor="middle">Content-</text>
<text x="234" y="188" text-anchor="middle">Type</text>
<rect x="314" y="132" width="112" height="76" rx="12" fill="#d7e8ff" stroke="#2b5f9e" stroke-width="2"/>
<text x="370" y="163" text-anchor="middle">JSON</text>
<text x="370" y="188" text-anchor="middle">parse</text>
<rect x="450" y="132" width="132" height="76" rx="12" fill="#d9f1e1" stroke="#2e7d51" stroke-width="2"/>
<text x="516" y="163" text-anchor="middle">screen</text>
<text x="516" y="188" text-anchor="middle">validator</text>
<rect x="606" y="132" width="72" height="76" rx="12" fill="#d9f1e1" stroke="#2e7d51" stroke-width="2"/>
<text x="642" y="174" text-anchor="middle">view</text>
</g>
<g stroke="#2b5f9e" stroke-width="3" fill="none">
<path d="M154 170h20m116 0h20m116 0h20m132 0h24"/>
<path d="m168 163 10 7-10 7m136-7 10 7-10 7m136-7 10 7-10 7m136-7 10 7-10 7"/>
</g>
<rect x="210" y="280" width="300" height="72" rx="14" fill="#ffe2dc" stroke="#b84b3b" stroke-width="2"/>
<text x="360" y="309" text-anchor="middle" font-size="19" font-weight="700">ошибка контракта</text>
<text x="360" y="333" text-anchor="middle" font-size="16">остановить render и записать код</text>
<path d="M516 208v38H360v34" stroke="#b84b3b" stroke-width="3" fill="none"/>
<path d="m352 270 8 12 8-12" stroke="#b84b3b" stroke-width="3" fill="none"/>
<text x="42" y="391" font-size="15" fill="#5f6368">HTTP 200 сообщает об обмене; validator решает, можно ли использовать representation.</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,33 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Граф решения перед техническим советом</title>
<desc id="desc">Три входа: вопрос, проверяемый источник и граница вывода. Только точные literals ведут к синтетической передаче плана. Неизвестный источник или заявленный результат ведут к остановке.</desc>
<defs>
<linearGradient id="bg" x1="0" x2="1" y1="0" y2="1"><stop stop-color="#10233F"/><stop offset="1" stop-color="#183B5C"/></linearGradient>
<marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#8ED1C0"/></marker>
<marker id="stop" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#FF897A"/></marker>
</defs>
<rect width="1200" height="720" rx="36" fill="url(#bg)"/>
<text x="70" y="78" fill="#F6FAFF" font-family="Arial, sans-serif" font-size="34" font-weight="700">Совет начинается с карточки решения</text>
<text x="70" y="116" fill="#B8CCE1" font-family="Arial, sans-serif" font-size="22">P118: форма вопроса, а не история будущего выпуска</text>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Граф настройки CSP и HSTS</title>
<desc id="desc">Карта security headers связывает список ресурсов с CSP, HTTPS-ответ с HSTS, а неизвестный ресурс ведёт к блокировке или отдельной проверке.</desc>
<defs><marker id="a" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#8ed1c0"/></marker><marker id="s" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#ff897a"/></marker></defs>
<rect width="1200" height="720" rx="36" fill="#10233f"/>
<text x="70" y="78" fill="#f6faff" font-family="Arial, sans-serif" font-size="34" font-weight="700">Security headers: два независимых слоя</text>
<text x="70" y="116" fill="#b8cce1" font-family="Arial, sans-serif" font-size="22">CSP ограничивает ресурсы, HSTS закрепляет HTTPS</text>
<g font-family="Arial, sans-serif">
<rect x="70" y="190" width="270" height="150" rx="20" fill="#224E71" stroke="#83D3C0" stroke-width="3"/>
<text x="102" y="238" fill="#FFFFFF" font-size="26" font-weight="700">1. Вопрос</text>
<text x="102" y="276" fill="#CFE5F4" font-size="21">Какое решение</text><text x="102" y="305" fill="#CFE5F4" font-size="21">нельзя принять?</text>
<rect x="70" y="430" width="270" height="150" rx="20" fill="#224E71" stroke="#83D3C0" stroke-width="3"/>
<text x="102" y="478" fill="#FFFFFF" font-size="26" font-weight="700">2. Источник</text>
<text x="102" y="516" fill="#CFE5F4" font-size="21">Дата, URL, версия</text><text x="102" y="545" fill="#CFE5F4" font-size="21">и предел применения</text>
<rect x="430" y="310" width="300" height="160" rx="20" fill="#176B67" stroke="#A9E5D4" stroke-width="4"/>
<text x="466" y="360" fill="#FFFFFF" font-size="27" font-weight="700">Exact literal</text>
<text x="466" y="400" fill="#D7FFF4" font-size="22">граница вывода</text><text x="466" y="430" fill="#D7FFF4" font-size="22">без review и outcome</text>
<rect x="820" y="250" width="305" height="170" rx="20" fill="#1D785A" stroke="#B9EDCE" stroke-width="4"/>
<text x="851" y="304" fill="#FFFFFF" font-size="25" font-weight="700">synthetic-plan-</text><text x="851" y="337" fill="#FFFFFF" font-size="25" font-weight="700">hand-off</text>
<text x="851" y="378" fill="#D4F7E3" font-size="20">productionEffect:</text><text x="851" y="405" fill="#D4F7E3" font-size="20">not-attempted</text>
<rect x="820" y="505" width="305" height="112" rx="20" fill="#823B46" stroke="#FF9A8A" stroke-width="4"/>
<text x="852" y="552" fill="#FFFFFF" font-size="26" font-weight="700">STOP</text><text x="852" y="584" fill="#FFE1DC" font-size="20">unknown / declared</text>
<rect x="70" y="210" width="270" height="150" rx="20" fill="#224e71" stroke="#83d3c0" stroke-width="3"/><text x="102" y="260" fill="#fff" font-size="26" font-weight="700">Ресурсы страницы</text><text x="102" y="300" fill="#cfe5f4" font-size="21">scripts · styles · frames</text><text x="102" y="332" fill="#cfe5f4" font-size="20">self + nonce</text>
<rect x="465" y="210" width="270" height="150" rx="20" fill="#176b67" stroke="#a9e5d4" stroke-width="4"/><text x="497" y="260" fill="#fff" font-size="27" font-weight="700">CSP</text><text x="497" y="300" fill="#d7fff4" font-size="21">default-src self</text><text x="497" y="332" fill="#d7fff4" font-size="20">object none · base-uri</text>
<rect x="860" y="210" width="270" height="150" rx="20" fill="#1d785a" stroke="#b9edce" stroke-width="4"/><text x="892" y="260" fill="#fff" font-size="27" font-weight="700">HSTS</text><text x="892" y="300" fill="#d4f7e3" font-size="21">HTTPS only</text><text x="892" y="332" fill="#d4f7e3" font-size="20">max-age + subdomains</text>
<path d="M340 285H465M735 285H860" fill="none" stroke="#8ed1c0" stroke-width="6" marker-end="url(#a)"/>
<rect x="360" y="505" width="480" height="100" rx="20" fill="#823b46" stroke="#ff9a8a" stroke-width="4"/><text x="600" y="550" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">unknown resource → block/report</text><text x="600" y="582" text-anchor="middle" fill="#ffe1dc" font-size="20">не отключать verify ради «зелёного» ответа</text>
<path d="M600 360V505" fill="none" stroke="#ff897a" stroke-width="6" marker-end="url(#s)"/>
</g>
<path d="M340 265H405Q425 265 425 310" fill="none" stroke="#8ED1C0" stroke-width="6" marker-end="url(#arrow)"/>
<path d="M340 505H390Q425 505 425 470" fill="none" stroke="#8ED1C0" stroke-width="6" marker-end="url(#arrow)"/>
<path d="M730 390H790" fill="none" stroke="#8ED1C0" stroke-width="7" marker-end="url(#arrow)"/>
<path d="M580 470V560Q580 590 810 590" fill="none" stroke="#FF897A" stroke-width="6" stroke-dasharray="12 12" marker-end="url(#stop)"/>
<text x="488" y="530" fill="#FFB2A7" font-family="Arial, sans-serif" font-size="19">unknown source / claim</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,20 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица рубрики качества инженерного текста</title>
<desc id="desc">Три независимых прохода: evidence, temporal и voice. Каждый требует названный вход; неизвестный вход или заявленный pass приводят к остановке, а не к оценке качества.</desc>
<rect width="1200" height="720" rx="36" fill="#F5F8FC"/>
<text x="65" y="76" fill="#142B45" font-family="Arial, sans-serif" font-size="34" font-weight="700">Три прохода не складываются в общий stamp</text>
<text x="65" y="113" fill="#526B82" font-family="Arial, sans-serif" font-size="22">Каждый проход проверяет свой риск и может остановить hand-off</text>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица web performance metrics</title>
<desc id="desc">Матрица разделяет LCP, INP и CLS по пользовательскому вопросу, порогу и диагностическому разрезу. Один хороший показатель не закрывает остальные.</desc>
<rect width="1200" height="720" rx="36" fill="#f5f8fc"/>
<text x="65" y="76" fill="#142b45" font-family="Arial, sans-serif" font-size="34" font-weight="700">LCP, INP и CLS отвечают на разные вопросы</text>
<text x="65" y="113" fill="#526b82" font-family="Arial, sans-serif" font-size="22">Порог помогает triage, но не называет причину</text>
<g font-family="Arial, sans-serif">
<rect x="65" y="165" width="1070" height="74" rx="14" fill="#193B5D"/>
<text x="100" y="211" fill="#FFFFFF" font-size="23" font-weight="700">Проход</text><text x="355" y="211" fill="#FFFFFF" font-size="23" font-weight="700">Что различает</text><text x="705" y="211" fill="#FFFFFF" font-size="23" font-weight="700">Stop без входа</text>
<rect x="65" y="239" width="1070" height="105" fill="#E8F2FB"/>
<text x="100" y="287" fill="#183A58" font-size="27" font-weight="700">Evidence</text><text x="355" y="280" fill="#254C6C" font-size="22">claim / источник / boundary</text><text x="705" y="280" fill="#A23F48" font-size="21">not-provided</text><text x="705" y="310" fill="#A23F48" font-size="21">не становится verdict</text>
<rect x="65" y="344" width="1070" height="105" fill="#F2F6FA"/>
<text x="100" y="392" fill="#183A58" font-size="27" font-weight="700">Temporal</text><text x="355" y="385" fill="#254C6C" font-size="22">editorial date / plan / cutoff</text><text x="705" y="385" fill="#A23F48" font-size="21">unknown date</text><text x="705" y="415" fill="#A23F48" font-size="21">закрывает маршрут</text>
<rect x="65" y="449" width="1070" height="105" fill="#E8F2FB"/>
<text x="100" y="497" fill="#183A58" font-size="27" font-weight="700">Voice</text><text x="355" y="490" fill="#254C6C" font-size="22">проблема / цена / действие / limit</text><text x="705" y="490" fill="#A23F48" font-size="21">claimed pass</text><text x="705" y="520" fill="#A23F48" font-size="21">не подменяет review</text>
<rect x="65" y="594" width="1070" height="70" rx="18" fill="#1E765D"/>
<text x="101" y="638" fill="#FFFFFF" font-size="26" font-weight="700">Только все named fixed states → synthetic-plan-hand-off</text>
<rect x="65" y="165" width="1070" height="70" rx="14" fill="#193b5d"/><text x="100" y="210" fill="#fff" font-size="23" font-weight="700">Метрика</text><text x="340" y="210" fill="#fff" font-size="23" font-weight="700">Вопрос</text><text x="690" y="210" fill="#fff" font-size="23" font-weight="700">Порог</text><text x="900" y="210" fill="#fff" font-size="23" font-weight="700">Разрез</text>
<rect x="65" y="235" width="1070" height="100" fill="#e8f2fb"/><rect x="65" y="335" width="1070" height="100" fill="#f2f6fa"/><rect x="65" y="435" width="1070" height="100" fill="#e8f2fb"/>
<text x="100" y="295" fill="#183a58" font-size="27" font-weight="700">LCP</text><text x="340" y="288" fill="#254c6c" font-size="21">крупный контент</text><text x="340" y="316" fill="#254c6c" font-size="21">появился?</text><text x="690" y="295" fill="#a23f48" font-size="22">≤ 2500 ms</text><text x="900" y="295" fill="#254c6c" font-size="21">TTFB + resource</text>
<text x="100" y="395" fill="#183a58" font-size="27" font-weight="700">INP</text><text x="340" y="388" fill="#254c6c" font-size="21">клик получил ответ?</text><text x="690" y="395" fill="#a23f48" font-size="22">≤ 200 ms</text><text x="900" y="395" fill="#254c6c" font-size="21">long task</text>
<text x="100" y="495" fill="#183a58" font-size="27" font-weight="700">CLS</text><text x="340" y="488" fill="#254c6c" font-size="21">layout не сдвинулся?</text><text x="690" y="495" fill="#a23f48" font-size="22">≤ 0.1</text><text x="900" y="495" fill="#254c6c" font-size="21">element + space</text>
<rect x="65" y="585" width="1070" height="70" rx="18" fill="#1e765d"/><text x="600" y="630" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">p75 по одинаковому сегменту → затем действие</text>
</g>
<path d="M320 239V554M670 239V554" stroke="#B4C9DC" stroke-width="3"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,24 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля корректирующей передачи без выдуманного review</title>
<desc id="desc">Вопрос и временная граница проходят только при отсутствии review inputs и деклараций качества. Любое заявленное review, публикация, correction или outcome останавливает передачу.</desc>
<defs><marker id="greenArrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#56C29B"/></marker><marker id="redArrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#E96F69"/></marker></defs>
<rect width="1200" height="720" rx="36" fill="#101F35"/>
<text x="65" y="78" fill="#F4F9FF" font-family="Arial, sans-serif" font-size="34" font-weight="700">Корректирующий hand-off не выдумывает петлю revision</text>
<text x="65" y="115" fill="#AFC4DA" font-family="Arial, sans-serif" font-size="22">P118 передаёт границу вопроса и останавливается перед feedback</text>
<g font-family="Arial, sans-serif">
<circle cx="210" cy="382" r="112" fill="#204968" stroke="#77C6B3" stroke-width="4"/>
<text x="152" y="367" fill="#FFFFFF" font-size="27" font-weight="700">Вопрос</text><text x="128" y="402" fill="#D2E6F3" font-size="20">claim остаётся</text><text x="148" y="430" fill="#D2E6F3" font-size="20">вопросом</text>
<circle cx="505" cy="382" r="112" fill="#204968" stroke="#77C6B3" stroke-width="4"/>
<text x="436" y="367" fill="#FFFFFF" font-size="26" font-weight="700">Граница</text><text x="422" y="402" fill="#D2E6F3" font-size="20">даты и cutoff</text><text x="424" y="430" fill="#D2E6F3" font-size="20">exact literal</text>
<circle cx="800" cy="382" r="112" fill="#146A61" stroke="#9DE0C8" stroke-width="4"/>
<text x="740" y="367" fill="#FFFFFF" font-size="25" font-weight="700">Hand-off</text><text x="730" y="402" fill="#D9FFF1" font-size="20">not-declared</text><text x="716" y="430" fill="#D9FFF1" font-size="20">not-attempted</text>
<rect x="910" y="526" width="220" height="100" rx="18" fill="#7E3844" stroke="#FF9087" stroke-width="4"/>
<text x="945" y="568" fill="#FFFFFF" font-size="25" font-weight="700">STOP</text><text x="937" y="600" fill="#FFE3DE" font-size="18">claimed result</text>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля эксплуатационной инструкции</title>
<desc id="desc">Симптом, scope и precondition ведут к одному обратимому действию, затем к проверке метрики и условному откату.</desc>
<defs><marker id="g" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#56c29b"/></marker><marker id="r" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#e96f69"/></marker></defs>
<rect width="1200" height="720" rx="36" fill="#101f35"/>
<text x="65" y="78" fill="#f4f9ff" font-family="Arial, sans-serif" font-size="34" font-weight="700">Runbook: вход → действие → проверка</text>
<text x="65" y="115" fill="#afc4da" font-family="Arial, sans-serif" font-size="22">Команда не считается завершённой без наблюдаемого результата</text>
<g font-family="Arial, sans-serif" text-anchor="middle">
<circle cx="190" cy="350" r="105" fill="#204968" stroke="#77c6b3" stroke-width="4"/><text x="190" y="337" fill="#fff" font-size="26" font-weight="700">Symptom</text><text x="190" y="375" fill="#d2e6f3" font-size="19">метрика + scope</text>
<circle cx="475" cy="350" r="105" fill="#204968" stroke="#77c6b3" stroke-width="4"/><text x="475" y="337" fill="#fff" font-size="26" font-weight="700">Precondition</text><text x="475" y="375" fill="#d2e6f3" font-size="19">доступ + версия</text>
<circle cx="760" cy="350" r="105" fill="#146a61" stroke="#9de0c8" stroke-width="4"/><text x="760" y="337" fill="#fff" font-size="26" font-weight="700">Action</text><text x="760" y="375" fill="#d9fff1" font-size="19">один шаг</text>
<circle cx="1045" cy="350" r="105" fill="#146a61" stroke="#9de0c8" stroke-width="4"/><text x="1045" y="337" fill="#fff" font-size="26" font-weight="700">Verify</text><text x="1045" y="375" fill="#d9fff1" font-size="19">метрика + окно</text>
<path d="M295 350H370M580 350H655M865 350H940" fill="none" stroke="#56c29b" stroke-width="7" marker-end="url(#g)"/>
<path d="M1045 455C1045 585 480 625 190 455" fill="none" stroke="#77c6b3" stroke-width="5" stroke-dasharray="11 11" marker-end="url(#g)"/>
<rect x="390" y="540" width="420" height="78" rx="16" fill="#7e3844" stroke="#ff9087" stroke-width="4"/><text x="600" y="588" fill="#fff" font-size="23" font-weight="700">проверка не пройдена → rollback</text>
<path d="M760 455V540" fill="none" stroke="#e96f69" stroke-width="7" marker-end="url(#r)"/>
</g>
<path d="M322 382H380" fill="none" stroke="#56C29B" stroke-width="7" marker-end="url(#greenArrow)"/>
<path d="M617 382H675" fill="none" stroke="#56C29B" stroke-width="7" marker-end="url(#greenArrow)"/>
<path d="M800 270C800 180 505 175 505 250" fill="none" stroke="#56C29B" stroke-width="5" stroke-dasharray="11 11" marker-end="url(#greenArrow)"/>
<text x="526" y="186" fill="#9DE0C8" font-family="Arial, sans-serif" font-size="19">новый scope решает, нужен ли review</text>
<path d="M850 460C900 490 935 510 955 525" fill="none" stroke="#E96F69" stroke-width="7" marker-end="url(#redArrow)"/>
<text x="814" y="502" fill="#FFAAA2" font-family="Arial, sans-serif" font-size="18">review / publication / correction / outcome</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="500" viewBox="0 0 720 500" role="img" aria-labelledby="title desc"><title id="title">Дерево сохранить, обернуть, заменить</title><desc id="desc">Русская схема планового выбора для synthetic legacy-контракта с остановками при отсутствии даты, версии и evidence.</desc><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:23px;font-weight:700}.s{font-size:15px}.b{font-size:17px;font-weight:700}.n{fill:#eef4ff;stroke:#3767b1;stroke-width:2}.g{fill:#e9f8ef;stroke:#288653;stroke-width:2}.r{fill:#fff0f0;stroke:#b53838;stroke-width:2}.a{stroke:#52657d;stroke-width:3;fill:none;marker-end:url(#m)}</style><marker id="m" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3 z" fill="#52657d"/></marker><rect width="720" height="500" fill="#fff"/><text x="36" y="42" class="h">План 2027-02: сохранить → обернуть → заменить</text><rect x="230" y="68" width="260" height="65" rx="10" class="n"/><text x="271" y="95" class="b">synthetic contract</text><text x="256" y="117" class="s">и version boundary названы?</text><path d="M360 133V165M360 165H150V196M360 165H570V196" class="a"/><rect x="40" y="198" width="220" height="82" rx="10" class="g"/><text x="112" y="229" class="b">СОХРАНИТЬ</text><text x="66" y="253" class="s">не менять без факта</text><text x="68" y="273" class="s">о legacy-правиле</text><rect x="460" y="198" width="220" height="82" rx="10" class="g"/><text x="532" y="229" class="b">ОБЕРНУТЬ</text><text x="488" y="253" class="s">назвать будущую</text><text x="494" y="273" class="s">границу адаптера</text><path d="M150 280V320H360V351M570 280V320H360" class="a"/><rect x="240" y="353" width="240" height="70" rx="10" class="g"/><text x="309" y="382" class="b">ЗАМЕНИТЬ</text><text x="271" y="405" class="s">только future hand-off</text><path d="M230 100H126V438M490 100H594V438" class="a"/><rect x="35" y="440" width="190" height="42" rx="8" class="r"/><text x="52" y="466" class="s">нет даты → STOP</text><rect x="495" y="440" width="190" height="42" rx="8" class="r"/><text x="508" y="466" class="s">нет evidence → STOP</text></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Дерево решения для Bitrix legacy</title>
<desc id="desc">Схема связывает callers, побочные эффекты и тесты с выбором сохранить вызов, добавить адаптер или заменить реализацию.</desc>
<defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#52657d"/></marker></defs>
<rect width="720" height="500" fill="#fff"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:23px;font-weight:700}.bold{font-size:16px;font-weight:700}.small{font-size:14px}.box{fill:#eef4ff;stroke:#3767b1;stroke-width:2}.ok{fill:#e9f8ef;stroke:#288653;stroke-width:2}.stop{fill:#fff0f0;stroke:#b53838;stroke-width:2}</style>
<text x="36" y="42" class="head">Bitrix legacy: сохранить → обернуть → заменить</text>
<rect x="208" y="72" width="304" height="72" rx="10" class="box"/><text x="360" y="103" text-anchor="middle" class="bold">Проверить callers и контракт</text><text x="360" y="126" text-anchor="middle" class="small">тесты · поля · побочные эффекты</text>
<path d="M360 144v42M360 186H126v34M360 186h234v34" fill="none" stroke="#52657d" stroke-width="3" marker-end="url(#arrow)"/>
<rect x="32" y="222" width="188" height="88" rx="10" class="ok"/><text x="126" y="255" text-anchor="middle" class="bold">СОХРАНИТЬ</text><text x="126" y="279" text-anchor="middle" class="small">эффекты ещё не ясны</text>
<rect x="266" y="222" width="188" height="88" rx="10" class="ok"/><text x="360" y="255" text-anchor="middle" class="bold">ОБЕРНУТЬ</text><text x="360" y="279" text-anchor="middle" class="small">callers несколько</text>
<rect x="500" y="222" width="188" height="88" rx="10" class="ok"/><text x="594" y="255" text-anchor="middle" class="bold">ЗАМЕНИТЬ</text><text x="594" y="279" text-anchor="middle" class="small">контракт и тесты готовы</text>
<path d="M126 310v52M360 310v52M594 310v52" fill="none" stroke="#52657d" stroke-width="3" marker-end="url(#arrow)"/>
<rect x="38" y="376" width="176" height="56" rx="8" class="stop"/><text x="126" y="399" text-anchor="middle" class="small" fill="#991b1b">добавить</text><text x="126" y="417" text-anchor="middle" class="small" fill="#991b1b">characterization test</text>
<rect x="272" y="376" width="176" height="56" rx="8" class="box"/><text x="360" y="410" text-anchor="middle" class="small">canonical input/output</text>
<rect x="506" y="376" width="176" height="56" rx="8" class="box"/><text x="594" y="410" text-anchor="middle" class="small">regression и rollback</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="500" viewBox="0 0 720 500" role="img" aria-labelledby="title desc"><title id="title">Петля передачи миграционного evidence</title><desc id="desc">Русская схема передаёт synthetic вопрос будущему владельцу и блокирует несуществующий migration test или положительный результат.</desc><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:23px;font-weight:700}.b{font-size:17px;font-weight:700}.s{font-size:15px}.n{fill:#eef4ff;stroke:#3767b1;stroke-width:2}.g{fill:#e9f8ef;stroke:#288653;stroke-width:2}.r{fill:#fff0f0;stroke:#b53838;stroke-width:2}.a{stroke:#52657d;stroke-width:3;fill:none;marker-end:url(#m)}.ar{stroke:#b53838;stroke-width:3;fill:none;marker-end:url(#mr)}</style><marker id="m" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3 z" fill="#52657d"/></marker><marker id="mr" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3 z" fill="#b53838"/></marker><rect width="720" height="500" fill="#fff"/><text x="37" y="42" class="h">Петля evidence: передать вопрос, не отчёт</text><rect x="45" y="130" width="185" height="92" rx="10" class="n"/><text x="74" y="163" class="b">fixed question</text><text x="65" y="188" class="s">evidence: not-collected</text><path d="M230 176H302" class="a"/><rect x="305" y="130" width="190" height="92" rx="10" class="g"/><text x="342" y="163" class="b">future owner</text><text x="330" y="188" class="s">отдельный scope?</text><path d="M400 222V297H213" class="a"/><rect x="45" y="300" width="205" height="88" rx="10" class="n"/><text x="76" y="334" class="b">вернуть hand-off</text><text x="69" y="359" class="s">без production action</text><path d="M495 176H550" class="ar"/><rect x="553" y="130" width="132" height="92" rx="10" class="r"/><text x="580" y="163" class="b">СТОП</text><text x="565" y="188" class="s">test/release</text><path d="M618 222V342H510" class="ar"/><rect x="305" y="300" width="208" height="88" rx="10" class="r"/><text x="332" y="334" class="b">запрет claim</text><text x="329" y="359" class="s">migration succeeded</text><text x="45" y="450" class="s">Зелёная ветка: synthetic-plan-hand-off. Красная: evidence не становится фактом от желания.</text></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Цикл проверки миграции Bitrix-поля</title>
<desc id="desc">Цикл соединяет mapping, нормализацию, запись, повторное чтение и повторный запуск. Ошибка в пустом значении возвращает поле на уточнение.</desc>
<defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#52657d"/></marker></defs>
<rect width="720" height="500" fill="#fff"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:23px;font-weight:700}.bold{font-size:15px;font-weight:700}.small{font-size:13px}.box{fill:#eef4ff;stroke:#3767b1;stroke-width:2}.good{fill:#e9f8ef;stroke:#288653;stroke-width:2}.bad{fill:#fff0f0;stroke:#b53838;stroke-width:2}.line{fill:none;stroke:#52657d;stroke-width:3;marker-end:url(#arrow)}</style>
<text x="36" y="42" class="head">Миграция поля: запись не равна проверке</text>
<rect x="42" y="120" width="150" height="80" rx="10" class="box"/><text x="117" y="151" text-anchor="middle" class="bold">Legacy input</text><text x="117" y="176" text-anchor="middle" class="small">PERSONAL_PHONE</text>
<rect x="285" y="120" width="150" height="80" rx="10" class="box"/><text x="360" y="151" text-anchor="middle" class="bold">Mapping</text><text x="360" y="176" text-anchor="middle" class="small">phone · email</text>
<rect x="528" y="120" width="150" height="80" rx="10" class="good"/><text x="603" y="151" text-anchor="middle" class="bold">Write</text><text x="603" y="176" text-anchor="middle" class="small">один стабильный ID</text>
<path d="M192 160h88M435 160h88" class="line"/>
<rect x="285" y="300" width="150" height="80" rx="10" class="good"/><text x="360" y="331" text-anchor="middle" class="bold">Read-back</text><text x="360" y="356" text-anchor="middle" class="small">сравнить смысл</text>
<rect x="42" y="300" width="150" height="80" rx="10" class="box"/><text x="117" y="331" text-anchor="middle" class="bold">Retry</text><text x="117" y="356" text-anchor="middle" class="small">не создать дубль</text>
<path d="M603 200v86H435M285 340h-88M117 300V235H360V200" class="line"/>
<rect x="500" y="300" width="178" height="80" rx="10" class="bad"/><text x="589" y="331" text-anchor="middle" class="bold" fill="#991b1b">Проверить пустоту</text><text x="589" y="356" text-anchor="middle" class="small" fill="#991b1b">missing ≠ clear</text>
<text x="360" y="450" text-anchor="middle" class="small">Вход, read-back и повтор должны иметь один понятный mapping.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="500" viewBox="0 0 720 500" role="img" aria-labelledby="title desc"><title id="title">Матрица границы версии и инварианта</title><desc id="desc">Русская матрица отделяет имя вызова от synthetic контракта и version boundary; пропуски возвращают stop.</desc><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:23px;font-weight:700}.t{font-size:16px;font-weight:700}.s{font-size:14px}.head{fill:#dbeaff}.ok{fill:#e9f8ef}.no{fill:#fff0f0}.line{stroke:#6581a5;stroke-width:2}</style><rect width="720" height="500" fill="#fff"/><text x="33" y="42" class="h">Граница версии: имя вызова не равно инварианту</text><rect x="36" y="75" width="648" height="355" fill="#fff" class="line"/><rect x="36" y="75" width="648" height="58" class="head"/><path d="M190 75V430M390 75V430M540 75V430M36 133H684M36 230H684M36 330H684" class="line"/><text x="64" y="108" class="t">Уровень</text><text x="225" y="108" class="t">Что известно</text><text x="432" y="108" class="t">Вывод</text><text x="562" y="108" class="t">Статус</text><text x="61" y="165" class="t">Имя вызова</text><text x="215" y="162" class="s">только лексема</text><text x="408" y="162" class="s">инвариант не доказан</text><rect x="554" y="145" width="110" height="38" rx="7" class="no"/><text x="577" y="170" class="t">СТОП</text><text x="61" y="262" class="t">Контракт</text><text x="212" y="249" class="s">named synthetic</text><text x="212" y="270" class="s">placeholder</text><text x="406" y="249" class="s">передать вопрос</text><text x="406" y="270" class="s">без API-факта</text><rect x="554" y="242" width="110" height="38" rx="7" class="ok"/><text x="568" y="267" class="t">HAND-OFF</text><text x="61" y="363" class="t">Версия</text><text x="212" y="350" class="s">boundary названа</text><text x="212" y="371" class="s">без номера</text><text x="406" y="350" class="s">не обещать</text><text x="406" y="371" class="s">совместимость</text><rect x="554" y="343" width="110" height="38" rx="7" class="no"/><text x="577" y="368" class="t">СТОП</text><text x="39" y="468" class="s">Красный: нет основания усиливать claim. Зелёный: только synthetic plan hand-off.</text></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Матрица поверхности Bitrix API</title>
<desc id="desc">Матрица отделяет подключение модуля, доступные методы, mapping полей и семантику ошибки перед заменой API.</desc>
<rect width="720" height="500" fill="#fff"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:23px;font-weight:700}.bold{font-size:15px;font-weight:700}.small{font-size:13px}.grid{stroke:#6581a5;stroke-width:1}.good{fill:#e9f8ef}.bad{fill:#fff0f0}.blue{fill:#dbeaff}</style>
<text x="32" y="42" class="head">Bitrix API: имя метода не равно контракту</text>
<rect x="36" y="74" width="648" height="58" class="blue"/><text x="58" y="109" class="bold">Слой</text><text x="205" y="109" class="bold">Проверяем</text><text x="430" y="109" class="bold">Результат</text><text x="568" y="109" class="bold">Дальше</text>
<g class="grid"><rect x="36" y="132" width="648" height="70" fill="#fff"/><rect x="36" y="202" width="648" height="70" fill="#f8fafc"/><rect x="36" y="272" width="648" height="70" fill="#fff"/><rect x="36" y="342" width="648" height="70" fill="#f8fafc"/></g>
<text x="58" y="174" class="bold">Модуль</text><text x="205" y="165" class="small">IncludeModule</text><text x="205" y="185" class="small">версия установки</text><rect x="420" y="151" width="112" height="34" rx="6" class="good"/><text x="476" y="174" text-anchor="middle" class="bold">загружен</text><text x="568" y="174" class="small">искать surface</text>
<text x="58" y="244" class="bold">Метод</text><text x="205" y="235" class="small">CUser или UserTable</text><text x="205" y="255" class="small">операция доступна</text><rect x="420" y="221" width="112" height="34" rx="6" class="good"/><text x="476" y="244" text-anchor="middle" class="bold">найден</text><text x="568" y="244" class="small">сверить поля</text>
<text x="58" y="314" class="bold">Поля</text><text x="205" y="305" class="small">type, empty, missing</text><text x="205" y="325" class="small">mapping операции</text><rect x="420" y="291" width="112" height="34" rx="6" class="good"/><text x="476" y="314" text-anchor="middle" class="bold">совпали</text><text x="568" y="314" class="small">запустить тест</text>
<text x="58" y="384" class="bold">Семантика</text><text x="205" y="375" class="small">ошибка, event, ID</text><text x="205" y="395" class="small">read-back</text><rect x="420" y="361" width="112" height="34" rx="6" class="bad"/><text x="476" y="384" text-anchor="middle" class="bold" fill="#991b1b">неясно</text><text x="568" y="377" class="small">остановить</text><text x="568" y="395" class="small">замену</text>
<text x="36" y="458" class="small">Поверхность API подтверждается только после проверки среды и смыслового результата операции.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,8 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица сравнимых условий frontend-сборки</title><desc id="desc">Русская таблица связывает вход, конфигурацию, кэш, CI и артефакт с будущим evidence. Нижняя красная строка сообщает, что скрытое условие и положительный вывод останавливают сценарий.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:19px;font-weight:700}.b{font-size:16px}.head{fill:#1f5f8b}.cell{fill:#fff;stroke:#8aa8be;stroke-width:2}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}</style>
<text x="55" y="58" class="h">Сравнимость: condition до числа и вывода</text><text x="55" y="86" class="b">План 2027-04 · все исторические evidence остаются not-collected</text>
<rect x="55" y="115" width="1090" height="62" class="head"/><g font-family="Arial" font-size="18" font-weight="700" fill="#fff"><text x="82" y="153" fill="#fff">Слой</text><text x="300" y="153" fill="#fff">Сейчас можно назвать</text><text x="590" y="153" fill="#fff">Нужно future evidence</text><text x="895" y="153" fill="#fff">Нельзя вывести</text></g>
<g class="b"><rect x="55" y="177" width="1090" height="72" class="cell"/><text x="82" y="220">Input</text><text x="300" y="220">synthetic shape</text><text x="590" y="220">граница входа</text><text x="895" y="220">что приложения равны</text><rect x="55" y="249" width="1090" height="72" class="cell"/><text x="82" y="292">Configuration</text><text x="300" y="292">два placeholder</text><text x="590" y="292">flags и provenance</text><text x="895" y="292">эквивалентность</text><rect x="55" y="321" width="1090" height="72" class="cell"/><text x="82" y="364">Cache</text><text x="300" y="364">not-collected</text><text x="590" y="364">key и state</text><text x="895" y="364">hit или ускорение</text><rect x="55" y="393" width="1090" height="72" class="cell"/><text x="82" y="436">CI</text><text x="300" y="436">condition question</text><text x="590" y="436">runner и boundary</text><text x="895" y="436">сравнимый timing</text><rect x="55" y="465" width="1090" height="72" class="cell"/><text x="82" y="508">Artifact</text><text x="300" y="508">artifact question</text><text x="590" y="508">manifest и состав</text><text x="895" y="508">меньший bundle</text></g>
<rect x="55" y="575" width="1090" height="88" rx="12" class="warn"/><text x="85" y="615" class="s">STOP: missing comparable condition, hidden configuration/cache assumption или positive result</text><text x="85" y="646" class="b">Разрешён только synthetic-plan-hand-off; productionEffect: not-attempted.</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица сравнимых условий frontend-сборки</title>
<desc id="desc">Таблица связывает исходный граф, конфигурацию, окружение, cache и output с проверкой сопоставимости замеров.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:30px;font-weight:700}.label{font-size:19px;font-weight:700}.body{font-size:16px}.header{fill:#1f5f8b}.cell{fill:#fff;stroke:#8aa8be;stroke-width:2}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}</style>
<text x="55" y="58" class="head">Сравнимость: условие до числа</text><text x="55" y="86" class="body">Одинаковый input · конфигурация · cache state · output</text>
<rect x="55" y="115" width="1090" height="62" class="header"/><text x="82" y="153" fill="#fff" class="label">Слой</text><text x="300" y="153" fill="#fff" class="label">Фиксируем</text><text x="610" y="153" fill="#fff" class="label">Проверяем</text><text x="910" y="153" fill="#fff" class="label">Если различается</text>
<g class="body"><rect x="55" y="177" width="1090" height="72" class="cell"/><text x="82" y="220" class="label">Input</text><text x="300" y="220">commit, lockfile, entry</text><text x="610" y="220">fingerprint</text><text x="910" y="220">исключить замер</text>
<rect x="55" y="249" width="1090" height="72" class="cell"/><text x="82" y="292" class="label">Config</text><text x="300" y="292">mode, flags, plugins</text><text x="610" y="292">normalized digest</text><text x="910" y="292">разные работы</text>
<rect x="55" y="321" width="1090" height="72" class="cell"/><text x="82" y="364" class="label">Cache</text><text x="300" y="364">cold/warm, key, dir</text><text x="610" y="364">hit и причина miss</text><text x="910" y="364">разделить серии</text>
<rect x="55" y="393" width="1090" height="72" class="cell"/><text x="82" y="436" class="label">Runner</text><text x="300" y="436">Node, OS, CPU</text><text x="610" y="436">порядок запуска</text><text x="910" y="436">не смешивать цифры</text>
<rect x="55" y="465" width="1090" height="72" class="cell"/><text x="82" y="508" class="label">Output</text><text x="300" y="508">chunks, maps, compression</text><text x="610" y="508">metafile и размеры</text><text x="910" y="508">уточнить budget</text></g>
<rect x="55" y="575" width="1090" height="88" rx="12" class="warn"/><text x="85" y="615" class="label" fill="#991b1b">СТОП: другой вход или cache state не даёт честного сравнения</text><text x="85" y="646" class="body" fill="#991b1b">Сначала исправить условия, затем обсуждать скорость.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -1,13 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Временная схема планового сравнения конфигураций frontend-сборки</title><desc id="desc">Русская схема ведёт от даты и двух synthetic конфигураций через условие сравнения к передаче вопроса будущему владельцу. Красные блоки останавливают недатированный сценарий и положительный результат.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:31px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:16px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.ok{fill:#edf8f1;stroke:#278456;stroke-width:3}.stop{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5b7187;stroke-width:4;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5b7187"/></marker></defs>
<text x="55" y="58" class="h">2027-04: сначала конфигурации, затем evidence</text><text x="55" y="88" class="b">source cutoff 2026-07-31 · future scenario · productionEffect: not-attempted</text>
<rect x="55" y="176" width="230" height="125" rx="12" class="box"/><text x="82" y="217" class="s">1. Граница времени</text><text x="82" y="250" class="b">2027-04 / cutoff</text><text x="82" y="276" class="b">не report</text>
<rect x="355" y="176" width="230" height="125" rx="12" class="box"/><text x="383" y="217" class="s">2. Две стороны</text><text x="383" y="250" class="b">baseline / candidate</text><text x="383" y="276" class="b">synthetic names</text>
<rect x="655" y="176" width="230" height="125" rx="12" class="box"/><text x="682" y="217" class="s">3. Условие</text><text x="682" y="250" class="b">input + output + CI</text><text x="682" y="276" class="b">not-collected</text>
<rect x="955" y="176" width="190" height="125" rx="12" class="ok"/><text x="982" y="217" class="s">4. Hand-off</text><text x="982" y="250" class="b">future owner</text><text x="982" y="276" class="b">без winner</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Последовательность сравнения frontend-сборки</title>
<desc id="desc">Схема ведёт от исходного fingerprint через одинаковую конфигурацию и cache state к замеру и разбору output.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:31px;font-weight:700}.label{font-size:20px;font-weight:700}.body{font-size:16px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.good{fill:#edf8f1;stroke:#278456;stroke-width:3}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5b7187;stroke-width:4;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5b7187"/></marker></defs>
<text x="55" y="58" class="head">Сборка: сначала условия, затем секундомер</text>
<rect x="55" y="176" width="230" height="125" rx="12" class="box"/><text x="82" y="217" class="label">1. Input</text><text x="82" y="250" class="body">commit + lockfile</text><text x="82" y="276" class="body">entry fingerprint</text>
<rect x="355" y="176" width="230" height="125" rx="12" class="box"/><text x="383" y="217" class="label">2. Config</text><text x="383" y="250" class="body">mode + flags</text><text x="383" y="276" class="body">plugins + target</text>
<rect x="655" y="176" width="230" height="125" rx="12" class="box"/><text x="682" y="217" class="label">3. Cache</text><text x="682" y="250" class="body">cold/warm + key</text><text x="682" y="276" class="body">одинаковая директория</text>
<rect x="955" y="176" width="190" height="125" rx="12" class="good"/><text x="982" y="217" class="label">4. Замер</text><text x="982" y="250" class="body">duration</text><text x="982" y="276" class="body">output bytes</text>
<path d="M285 238H355M585 238H655M885 238H955" class="line"/>
<rect x="90" y="455" width="310" height="115" rx="12" class="stop"/><text x="118" y="496" class="s">STOP: нет даты</text><text x="118" y="529" class="b">undated future scenario</text><text x="118" y="553" class="b">не становится планом</text>
<rect x="770" y="455" width="330" height="115" rx="12" class="stop"/><text x="798" y="496" class="s">STOP: «стало лучше»</text><text x="798" y="529" class="b">нет config, artifact, timing,</text><text x="798" y="553" class="b">cache hit или migration result</text>
<path d="M170 301V455M1045 301V455" class="line"/><text x="600" y="655" text-anchor="middle" class="b">Исторические config/CI-артефакты и результаты — только not-collected shape, не данные.</text>
<rect x="90" y="455" width="310" height="115" rx="12" class="warn"/><text x="118" y="496" class="label" fill="#991b1b">СТОП: fingerprint другой</text><text x="118" y="529" class="body" fill="#991b1b">не считать цифры одной серией</text>
<rect x="770" y="455" width="330" height="115" rx="12" class="good"/><text x="798" y="496" class="label" fill="#14532d">5. Output diff</text><text x="798" y="529" class="body" fill="#14532d">metafile, chunks, maps</text><text x="798" y="553" class="body" fill="#14532d">затем browser check</text>
<path d="M170 301V455M1045 301V455" class="line"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,12 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля передачи синтетического evidence для frontend-сборки</title><desc id="desc">Русская диаграмма показывает путь от синтетического вопроса к проверке даты, двух конфигураций и условия сравнения. Ошибка уходит в красный stop; корректная форма передаётся будущему владельцу без результата production.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:16px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.ok{fill:#edf8f1;stroke:#278456;stroke-width:3}.stop{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5b7187;stroke-width:4;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5b7187"/></marker></defs>
<text x="55" y="58" class="h">Synthetic evidence hand-off: вопрос не становится отчётом</text><text x="55" y="88" class="b">2027-04 scenario · source cutoff 2026-07-31 · no build report</text>
<rect x="55" y="178" width="230" height="120" rx="12" class="box"/><text x="82" y="219" class="s">Вход</text><text x="82" y="251" class="b">fixed in-memory literal</text><text x="82" y="276" class="b">not-collected shape</text>
<rect x="355" y="178" width="230" height="120" rx="12" class="box"/><text x="382" y="219" class="s">Проверка даты</text><text x="382" y="251" class="b">2027-04 / cutoff</text><text x="382" y="276" class="b">не retrospective</text>
<rect x="655" y="178" width="230" height="120" rx="12" class="box"/><text x="682" y="219" class="s">Сравнимость</text><text x="682" y="251" class="b">две configuration</text><text x="682" y="276" class="b">named condition</text>
<rect x="955" y="178" width="190" height="120" rx="12" class="ok"/><text x="981" y="219" class="s">Передача</text><text x="981" y="251" class="b">future owner</text><text x="981" y="276" class="b">not-attempted</text>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Цикл разбора роста bundle</title>
<desc id="desc">Диаграмма показывает переход от двух metafile к delta input, chunk, source map и браузерной проверке результата.</desc>
<rect width="1200" height="720" fill="#f8fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:30px;font-weight:700}.label{font-size:20px;font-weight:700}.body{font-size:16px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.good{fill:#edf8f1;stroke:#278456;stroke-width:3}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5b7187;stroke-width:4;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5b7187"/></marker></defs>
<text x="55" y="58" class="head">Bundle вырос: ищем input, а не виновника</text>
<rect x="55" y="178" width="230" height="120" rx="12" class="box"/><text x="82" y="219" class="label">До</text><text x="82" y="251" class="body">metafile + output</text><text x="82" y="276" class="body">input bytes</text>
<rect x="355" y="178" width="230" height="120" rx="12" class="box"/><text x="382" y="219" class="label">После</text><text x="382" y="251" class="body">тот же fingerprint</text><text x="382" y="276" class="body">новый output</text>
<rect x="655" y="178" width="230" height="120" rx="12" class="good"/><text x="682" y="219" class="label">Delta</text><text x="682" y="251" class="body">top inputs</text><text x="682" y="276" class="body">chunk и import</text>
<rect x="955" y="178" width="190" height="120" rx="12" class="good"/><text x="981" y="219" class="label">Проверка</text><text x="981" y="251" class="body">map + network</text><text x="981" y="276" class="body">cache и transfer</text>
<path d="M285 238H355M585 238H655M885 238H955" class="line"/>
<rect x="305" y="462" width="590" height="118" rx="12" class="stop"/><text x="335" y="504" class="s">STOP: дата отсутствует, condition не назван или configuration/cache скрыты</text><text x="335" y="538" class="b">Запрещено: cache hit, build timing, bundle size, migration или «сборка улучшена».</text><text x="335" y="563" class="b">Следующий ход — уточнить вопрос, а не заполнить пробел предположением.</text>
<path d="M470 298V462M770 298V462" class="line"/><text x="600" y="656" text-anchor="middle" class="b">Допустимый output: synthetic-plan-hand-off → future evidence owner</text>
<rect x="305" y="462" width="590" height="118" rx="12" class="warn"/><text x="335" y="504" class="label" fill="#991b1b">СТОП: input различается или карта не совпадает</text><text x="335" y="538" class="body" fill="#991b1b">Не делать вывод о performance по размеру одного файла.</text><text x="335" y="563" class="body" fill="#991b1b">Сначала вернуть сравнение к одинаковым условиям.</text>
<path d="M470 298V462M770 298V462" class="line"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc"><title id="title">Матрица ограничений и опровержимости runtime trade-off</title><desc id="desc">Таблица связывает четыре именованных класса ограничений с будущим evidence и стоп-сигналами. Нижняя красная строка запрещает скрытую конфигурацию benchmark и результат-победитель.</desc><rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:29px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:16px}.head{fill:#1f5f8b}.cell{fill:#fff;stroke:#8aa8be;stroke-width:2}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}</style><text x="55" y="54" class="h">Runtime trade-off: ограничение → evidence → falsification</text><rect x="55" y="95" width="1090" height="65" class="head"/><g fill="#fff" font-family="Arial" font-size="19" font-weight="700"><text x="80" y="135" fill="#fff">Ограничение</text><text x="350" y="135" fill="#fff">Механизм вопроса</text><text x="670" y="135" fill="#fff">Нужный future evidence</text><text x="940" y="135" fill="#fff">Стоп-сигнал</text></g><g class="b"><rect x="55" y="160" width="1090" height="90" class="cell"/><text x="80" y="205">Latency</text><text x="350" y="195">граница операции</text><text x="350" y="220">и budget</text><text x="670" y="205">полная config</text><text x="940" y="205">не тот путь</text><rect x="55" y="250" width="1090" height="90" class="cell"/><text x="80" y="295">Ownership</text><text x="350" y="285">lifecycle и API</text><text x="350" y="310">boundary</text><text x="670" y="295">contract provenance</text><text x="940" y="295">скрытый alias</text><rect x="55" y="340" width="1090" height="90" class="cell"/><text x="80" y="385">Delivery</text><text x="350" y="375">compiler, runtime,</text><text x="350" y="400">packaging</text><text x="670" y="385">target и flags</text><text x="940" y="385">несовместимость</text><rect x="55" y="430" width="1090" height="90" class="cell"/><text x="80" y="475">Observability</text><text x="350" y="465">допустимый input</text><text x="350" y="490">и доступ</text><text x="670" y="475">согласованный owner</text><text x="940" y="475">нет provenance</text></g><rect x="55" y="550" width="1090" height="105" rx="10" class="warn"/><text x="85" y="592" class="s">Сейчас: benchmark = not-run; configuration/result = not-collected</text><text x="85" y="625" class="b">Скрытая конфигурация, неназванное ограничение и заявленный winner возвращают fail-closed stop.</text></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица границы D и C API</title>
<desc id="desc">Таблица связывает атрибут безопасности D, проверку указателя и длины, владельца памяти и допустимый интерфейс C.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:29px;font-weight:700}.label{font-size:18px;font-weight:700}.body{font-size:16px}.header{fill:#1f5f8b}.cell{fill:#fff;stroke:#8aa8be;stroke-width:2}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}</style>
<text x="55" y="54" class="head">D и C: ограничение → проверка → безопасный интерфейс</text>
<rect x="55" y="95" width="1090" height="65" class="header"/><text x="80" y="135" fill="#fff" class="label">Уровень</text><text x="330" y="135" fill="#fff" class="label">Что проверяем</text><text x="650" y="135" fill="#fff" class="label">Кто владеет правилом</text><text x="945" y="135" fill="#fff" class="label">Ошибка</text>
<g class="body"><rect x="55" y="160" width="1090" height="95" class="cell"/><text x="80" y="212" class="label">@safe</text><text x="330" y="200">ограниченные операции</text><text x="330" y="226">и типы данных</text><text x="650" y="212">компилятор + тест</text><text x="945" y="212" fill="#991b1b">довериться C</text>
<rect x="55" y="255" width="1090" height="95" class="cell"/><text x="80" y="307" class="label">@trusted</text><text x="330" y="295">pointer, length, lifetime</text><text x="330" y="321">до вызова</text><text x="650" y="307">автор wrapper</text><text x="945" y="307" fill="#991b1b">слишком большой scope</text>
<rect x="55" y="350" width="1090" height="95" class="cell"/><text x="80" y="402" class="label">@system</text><text x="330" y="390">raw pointer и ABI</text><text x="330" y="416">вручную</text><text x="650" y="402">review + sanitizer</text><text x="945" y="402" fill="#991b1b">нет контракта</text>
<rect x="55" y="445" width="1090" height="95" class="cell"/><text x="80" y="497" class="label">slice</text><text x="330" y="485">capacity и диапазон</text><text x="330" y="511">вместе с данными</text><text x="650" y="497">граница D</text><text x="945" y="497" fill="#991b1b">length извне</text></g>
<rect x="55" y="580" width="1090" height="78" rx="10" class="warn"/><text x="85" y="617" class="label" fill="#991b1b">СТОП: pointer, length или lifetime не имеют доказанного контракта</text><text x="85" y="642" class="body" fill="#991b1b">Не расширять @trusted; вернуть данные к boundary.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -1 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc"><title id="title">Петля synthetic evidence hand-off</title><desc id="desc">Процесс проверяет дату, workload, constraints и состояние benchmark. При ошибке возникает красный stop, при корректном fixed literal вопрос передаётся будущему владельцу evidence без production effect.</desc><rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.stop{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.out{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5d7085"/></marker></defs><text x="55" y="55" class="h">Synthetic evidence hand-off: что можно передать в 2027-03</text><rect x="60" y="170" width="245" height="130" rx="12" class="box"/><text x="85" y="210" class="s">Вход</text><text x="85" y="242" class="b">2027-03 / cutoff</text><text x="85" y="268" class="b">fixed literal</text><rect x="375" y="170" width="245" height="130" rx="12" class="box"/><text x="400" y="210" class="s">Имена</text><text x="400" y="242" class="b">workload + constraints</text><text x="400" y="268" class="b">synthetic questions</text><rect x="690" y="170" width="245" height="130" rx="12" class="box"/><text x="715" y="210" class="s">Benchmark</text><text x="715" y="242" class="b">not-run</text><text x="715" y="268" class="b">not-collected</text><rect x="905" y="440" width="240" height="120" rx="12" class="out"/><text x="930" y="480" class="s">Hand-off</text><text x="930" y="511" class="b">future evidence owner</text><text x="930" y="537" class="b">effect: not-attempted</text><rect x="365" y="450" width="385" height="115" rx="12" class="stop"/><text x="392" y="490" class="s">STOP</text><text x="392" y="520" class="b">undated, unnamed, hidden config</text><text x="392" y="546" class="b">или declared winner</text><path d="M305 235H375" class="line"/><path d="M620 235H690" class="line"/><path d="M935 300V440" class="line"/><path d="M500 300V450" class="line"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Цикл проверки D и C ABI</title>
<desc id="desc">Процесс проверяет размер пакета, порядок байтов, обязательные поля и код возврата до вызова C и после него.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:30px;font-weight:700}.label{font-size:20px;font-weight:700}.body{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.good{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5d7085"/></marker></defs>
<text x="55" y="55" class="head">FFI-проверка: пакет должен совпасть с ABI</text>
<rect x="55" y="170" width="245" height="130" rx="12" class="box"/><text x="82" y="210" class="label">Пакет</text><text x="82" y="242" class="body">byte length</text><text x="82" y="268" class="body">версия и поля</text>
<rect x="375" y="170" width="245" height="130" rx="12" class="box"/><text x="402" y="210" class="label">Layout</text><text x="402" y="242" class="body">offset, alignment</text><text x="402" y="268" class="body">endianness</text>
<rect x="690" y="170" width="245" height="130" rx="12" class="good"/><text x="717" y="210" class="label">C-вызов</text><text x="717" y="242" class="body">extern(C)</text><text x="717" y="268" class="body">код возврата</text>
<rect x="955" y="440" width="190" height="120" rx="12" class="good"/><text x="980" y="480" class="label">Результат</text><text x="980" y="512" class="body">read output</text><text x="980" y="538" class="body">по версии</text>
<rect x="365" y="450" width="385" height="115" rx="12" class="warn"/><text x="392" y="490" class="label" fill="#991b1b">СТОП</text><text x="392" y="522" class="body" fill="#991b1b">размер, байты или поле</text><text x="392" y="548" class="body" fill="#991b1b">не совпали с header</text>
<path d="M300 235H375M620 235H690M935 300V440M500 300V450" class="line"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,12 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Карта планового сравнения runtime для D</title><desc id="desc">Схема ведёт от synthetic нагрузки и ограничений к вариантам D и не-D, а затем к безопасной передаче вопроса. Красные блоки останавливают default, скрытый benchmark и объявление победителя.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.stop{fill:#fff1f1;stroke:#bd3f3f;stroke-width:3}.out{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3z" fill="#5d7085"/></marker></defs>
<text x="55" y="55" class="h">D в 2027-03: карта вопроса, а не выбор runtime</text>
<rect x="55" y="110" width="260" height="120" rx="12" class="box"/><text x="80" y="150" class="s">1. Нагрузка</text><text x="80" y="181" class="b">named synthetic request shape</text><text x="80" y="207" class="b">не сервис, не profile</text>
<rect x="55" y="310" width="260" height="140" rx="12" class="box"/><text x="80" y="350" class="s">2. Ограничения</text><text x="80" y="381" class="b">latency / ownership</text><text x="80" y="407" class="b">delivery / observability</text>
<rect x="455" y="180" width="270" height="150" rx="12" class="box"/><text x="485" y="220" class="s">3. Варианты</text><text x="485" y="251" class="b">D рядом с альтернативами</text><text x="485" y="277" class="b">без языка по умолчанию</text>
<rect x="860" y="180" width="275" height="150" rx="12" class="box"/><text x="888" y="220" class="s">4. Benchmark</text><text x="888" y="251" class="b">not-run</text><text x="888" y="277" class="b">configuration: not-collected</text>
<rect x="860" y="470" width="275" height="120" rx="12" class="out"/><text x="888" y="510" class="s">5. Hand-off</text><text x="888" y="541" class="b">productionEffect: not-attempted</text>
<rect x="420" y="420" width="320" height="130" rx="12" class="stop"/><text x="448" y="460" class="s">STOP</text><text x="448" y="490" class="b">default без контекста</text><text x="448" y="516" class="b">hidden config или winner</text>
<path d="M315 170H455" class="line"/><path d="M315 380H420" class="line"/><path d="M725 255H860" class="line"/><path d="M998 330V470" class="line"/><path d="M590 330V420" class="line"/>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Карта выбора D для прикладной утилиты</title>
<desc id="desc">Схема ведёт от нагрузки и ограничений к сравнению D с текущим языком, затем к прототипу и измеряемому решению.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.head{font-size:30px;font-weight:700}.label{font-size:20px;font-weight:700}.body{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.good{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.warn{fill:#fff0f0;stroke:#bd3f3f;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;fill:none;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0 0L0 6L9 3z" fill="#5d7085"/></marker></defs>
<text x="55" y="55" class="head">D: сначала нагрузка и границы, затем выбор языка</text>
<rect x="55" y="125" width="260" height="130" rx="12" class="box"/><text x="82" y="165" class="label">1. Workload</text><text x="82" y="198" class="body">throughput, latency</text><text x="82" y="224" class="body">размер данных</text>
<rect x="55" y="350" width="260" height="140" rx="12" class="box"/><text x="82" y="390" class="label">2. Ограничения</text><text x="82" y="423" class="body">native boundary</text><text x="82" y="449" class="body">targets и доставка</text>
<rect x="455" y="190" width="270" height="160" rx="12" class="box"/><text x="485" y="232" class="label">3. Сравнение</text><text x="485" y="266" class="body">D рядом с текущим языком</text><text x="485" y="294" class="body">одинаковый вход и output</text>
<rect x="860" y="190" width="280" height="160" rx="12" class="good"/><text x="890" y="232" class="label">4. Прототип</text><text x="890" y="266" class="body">compiler, profile, binary</text><text x="890" y="294" class="body">время и стоимость поддержки</text>
<rect x="420" y="480" width="320" height="120" rx="12" class="warn"/><text x="450" y="520" class="label" fill="#991b1b">СТОП</text><text x="450" y="552" class="body" fill="#991b1b">нет workload или бюджета</text><text x="450" y="577" class="body" fill="#991b1b">язык не является лечением</text>
<path d="M315 190H455M315 420H420M725 270H860M1000 350V480M585 350V480" class="line"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,26 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Карта развития плановой web-диагностики</title>
<desc id="desc">Временная шкала показывает, как от синтетического симптома перейти к именованной гипотезе, плановым сигналам и безопасной передаче вопроса. Красные блоки обозначают остановки.</desc>
<title id="title">Маршрут диагностики web-запроса</title>
<desc id="desc">Схема ведёт от внешнего симптома через конверт запроса и различающий сигнал к проверяемому действию. Отдельная ветка показывает разрыв цепочки.</desc>
<rect width="720" height="500" fill="#f8fafc"/>
<text x="42" y="52" fill="#172554" font-family="Arial, sans-serif" font-size="25" font-weight="700">Плановая карта диагностики на 2027-01</text>
<text x="42" y="78" fill="#475569" font-family="Arial, sans-serif" font-size="15">source cutoff 2026-07-31 · инструменты меняются, границы вывода остаются</text>
<line x1="74" y1="178" x2="646" y2="178" stroke="#2563eb" stroke-width="6" stroke-linecap="round"/>
<g font-family="Arial, sans-serif">
<circle cx="92" cy="178" r="22" fill="#1d4ed8"/><text x="92" y="184" text-anchor="middle" fill="#fff" font-size="16" font-weight="700">1</text>
<text x="92" y="225" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Симптом</text><text x="92" y="247" text-anchor="middle" fill="#475569" font-size="13">synthetic вопрос</text>
<circle cx="252" cy="178" r="22" fill="#1d4ed8"/><text x="252" y="184" text-anchor="middle" fill="#fff" font-size="16" font-weight="700">2</text>
<text x="252" y="225" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Гипотеза</text><text x="252" y="247" text-anchor="middle" fill="#475569" font-size="13">опровержимая</text>
<circle cx="412" cy="178" r="22" fill="#1d4ed8"/><text x="412" y="184" text-anchor="middle" fill="#fff" font-size="16" font-weight="700">3</text>
<text x="412" y="225" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Сигналы</text><text x="412" y="247" text-anchor="middle" fill="#475569" font-size="13">planned-input</text>
<circle cx="572" cy="178" r="22" fill="#15803d"/><text x="572" y="184" text-anchor="middle" fill="#fff" font-size="16" font-weight="700">4</text>
<text x="572" y="225" text-anchor="middle" fill="#14532d" font-size="16" font-weight="700">Hand-off</text><text x="572" y="247" text-anchor="middle" fill="#475569" font-size="13">not-attempted</text>
<style>text{font-family:Arial,sans-serif;fill:#172554}.head{font-size:25px;font-weight:700}.label{font-size:16px;font-weight:700}.small{font-size:13px}.box{fill:#dbeafe;stroke:#2563eb;stroke-width:2}.ok{fill:#dcfce7;stroke:#15803d;stroke-width:2}.stop{fill:#fef2f2;stroke:#dc2626;stroke-width:2}.line{stroke:#2563eb;stroke-width:5}</style>
<text x="38" y="48" class="head">Web-диагностика: от симптома к проверке</text>
<text x="38" y="76" class="small">Один запрос · один различающий сигнал · одно действие</text>
<line x1="78" y1="172" x2="642" y2="172" class="line"/>
<g>
<circle cx="86" cy="172" r="23" fill="#1d4ed8"/><text x="86" y="178" text-anchor="middle" fill="#fff" font-size="16">1</text>
<text x="86" y="220" text-anchor="middle" class="label">Симптом</text><text x="86" y="242" text-anchor="middle" class="small">502, 403, пустой DOM</text>
<circle cx="274" cy="172" r="23" fill="#1d4ed8"/><text x="274" y="178" text-anchor="middle" fill="#fff" font-size="16">2</text>
<text x="274" y="220" text-anchor="middle" class="label">Конверт</text><text x="274" y="242" text-anchor="middle" class="small">route · time · request-id</text>
<circle cx="462" cy="172" r="23" fill="#1d4ed8"/><text x="462" y="178" text-anchor="middle" fill="#fff" font-size="16">3</text>
<text x="462" y="220" text-anchor="middle" class="label">Сигнал</text><text x="462" y="242" text-anchor="middle" class="small">разделяет причины</text>
<circle cx="650" cy="172" r="23" fill="#15803d"/><text x="650" y="178" text-anchor="middle" fill="#fff" font-size="16">4</text>
<text x="650" y="220" text-anchor="middle" class="label">Действие</text><text x="650" y="242" text-anchor="middle" class="small">лог, trace или DOM</text>
</g>
<path d="M252 282 L252 314 L184 314" fill="none" stroke="#dc2626" stroke-width="3"/><polygon points="184,314 195,307 195,321" fill="#dc2626"/>
<rect x="42" y="316" width="192" height="74" rx="10" fill="#fef2f2" stroke="#dc2626" stroke-width="2"/>
<text x="58" y="346" fill="#991b1b" font-family="Arial, sans-serif" font-size="15" font-weight="700">STOP: нет имени</text><text x="58" y="369" fill="#991b1b" font-family="Arial, sans-serif" font-size="14">сигнала или гипотезы</text>
<path d="M412 282 L412 314 L486 314" fill="none" stroke="#dc2626" stroke-width="3"/><polygon points="486,314 475,307 475,321" fill="#dc2626"/>
<rect x="486" y="316" width="192" height="74" rx="10" fill="#fef2f2" stroke="#dc2626" stroke-width="2"/>
<text x="502" y="346" fill="#991b1b" font-family="Arial, sans-serif" font-size="15" font-weight="700">STOP: evidence</text><text x="502" y="369" fill="#991b1b" font-family="Arial, sans-serif" font-size="14">сильнее plan input</text>
<rect x="42" y="422" width="636" height="43" rx="8" fill="#e0f2fe"/>
<text x="360" y="450" text-anchor="middle" fill="#0c4a6e" font-family="Arial, sans-serif" font-size="15">Вывод не сильнее входа: никакого root cause, отчёта или production effect</text>
<path d="M274 198v68H116" fill="none" stroke="#dc2626" stroke-width="3"/>
<rect x="38" y="284" width="230" height="80" rx="10" class="stop"/>
<text x="55" y="316" class="label" fill="#991b1b">СТОП: нет ключа связи</text><text x="55" y="338" class="small" fill="#991b1b">не соединять события</text><text x="55" y="355" class="small" fill="#991b1b">только по времени</text>
<rect x="306" y="302" width="350" height="72" rx="10" class="ok"/>
<text x="481" y="331" text-anchor="middle" class="label" fill="#14532d">Вывод ограничен наблюдением</text><text x="481" y="353" text-anchor="middle" class="small" fill="#14532d">сначала найти слой, потом менять код</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,21 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Петля synthetic debugging hand-off</title>
<desc id="desc">Диаграмма показывает переход от синтетического симптома к гипотезе и плановым сигналам. Неназванные поля, evidence сильнее input и позитивный вывод ведут в stop, а допустимый вариант передаётся будущему владельцу evidence.</desc>
<defs><marker id="arrowBlue" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#2563eb"/></marker><marker id="arrowRed" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#dc2626"/></marker></defs>
<title id="title">Петля проверки гипотезы</title>
<desc id="desc">Диаграмма соединяет внешний симптом, две проверяемые гипотезы и сигнал, который отличает их. При отсутствии записи цепочка возвращается к качеству журналирования.</desc>
<defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#2563eb"/></marker><marker id="red" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L9,3 L0,6 Z" fill="#dc2626"/></marker></defs>
<rect width="720" height="500" fill="#f8fafc"/>
<text x="38" y="50" fill="#172554" font-family="Arial, sans-serif" font-size="24" font-weight="700">Synthetic hand-off: вопрос, а не кейс</text>
<text x="38" y="76" fill="#475569" font-family="Arial, sans-serif" font-size="15">2027-01 · source cutoff 2026-07-31 · productionEffect not-attempted</text>
<g font-family="Arial, sans-serif">
<rect x="52" y="137" width="158" height="74" rx="12" fill="#dbeafe" stroke="#2563eb" stroke-width="2"/><text x="131" y="167" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Симптом</text><text x="131" y="190" text-anchor="middle" fill="#334155" font-size="13">named question</text>
<rect x="281" y="137" width="158" height="74" rx="12" fill="#dbeafe" stroke="#2563eb" stroke-width="2"/><text x="360" y="167" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Гипотеза</text><text x="360" y="190" text-anchor="middle" fill="#334155" font-size="13">named alternative</text>
<rect x="510" y="137" width="158" height="74" rx="12" fill="#dbeafe" stroke="#2563eb" stroke-width="2"/><text x="589" y="167" text-anchor="middle" fill="#172554" font-size="16" font-weight="700">Сигналы</text><text x="589" y="190" text-anchor="middle" fill="#334155" font-size="13">planned-input</text>
<path d="M210 174 L278 174" stroke="#2563eb" stroke-width="4" marker-end="url(#arrowBlue)"/><path d="M439 174 L507 174" stroke="#2563eb" stroke-width="4" marker-end="url(#arrowBlue)"/>
<path d="M589 214 C589 273,421 275,421 322" fill="none" stroke="#2563eb" stroke-width="4" marker-end="url(#arrowBlue)"/>
<rect x="300" y="322" width="242" height="78" rx="12" fill="#dcfce7" stroke="#15803d" stroke-width="2"/><text x="421" y="352" text-anchor="middle" fill="#14532d" font-size="16" font-weight="700">Synthetic plan hand-off</text><text x="421" y="376" text-anchor="middle" fill="#166534" font-size="13">future evidence owner</text>
<path d="M360 214 L360 272 L130 272 L130 322" fill="none" stroke="#dc2626" stroke-width="3" marker-end="url(#arrowRed)"/>
<rect x="44" y="322" width="172" height="78" rx="12" fill="#fef2f2" stroke="#dc2626" stroke-width="2"/><text x="130" y="351" text-anchor="middle" fill="#991b1b" font-size="16" font-weight="700">STOP</text><text x="130" y="374" text-anchor="middle" fill="#991b1b" font-size="13">нет имени / даты</text>
<path d="M589 214 L589 272 L635 272 L635 322" fill="none" stroke="#dc2626" stroke-width="3" marker-end="url(#arrowRed)"/>
<rect x="550" y="322" width="140" height="78" rx="12" fill="#fef2f2" stroke="#dc2626" stroke-width="2"/><text x="620" y="351" text-anchor="middle" fill="#991b1b" font-size="16" font-weight="700">STOP</text><text x="620" y="374" text-anchor="middle" fill="#991b1b" font-size="13">evidence &gt; input</text>
</g>
<text x="360" y="456" text-anchor="middle" fill="#475569" font-family="Arial, sans-serif" font-size="15">Запрещённый positive conclusion: root-cause-confirmed</text>
<style>text{font-family:Arial,sans-serif;fill:#172554}.head{font-size:24px;font-weight:700}.label{font-size:16px;font-weight:700}.small{font-size:13px}.box{fill:#dbeafe;stroke:#2563eb;stroke-width:2}.ok{fill:#dcfce7;stroke:#15803d;stroke-width:2}.stop{fill:#fef2f2;stroke:#dc2626;stroke-width:2}</style>
<text x="38" y="48" class="head">Петля: гипотеза должна изменить проверку</text>
<rect x="44" y="130" width="174" height="82" rx="12" class="box"/><text x="131" y="164" text-anchor="middle" class="label">Симптом</text><text x="131" y="188" text-anchor="middle" class="small">edge 502</text>
<rect x="273" y="130" width="174" height="82" rx="12" class="box"/><text x="360" y="164" text-anchor="middle" class="label">Гипотеза</text><text x="360" y="188" text-anchor="middle" class="small">gateway или app</text>
<rect x="502" y="130" width="174" height="82" rx="12" class="box"/><text x="589" y="164" text-anchor="middle" class="label">Сигнал</text><text x="589" y="188" text-anchor="middle" class="small">одинаковый request-id</text>
<path d="M218 171h52M447 171h52" stroke="#2563eb" stroke-width="4" marker-end="url(#arrow)"/>
<rect x="251" y="320" width="218" height="78" rx="12" class="ok"/><text x="360" y="351" text-anchor="middle" class="label" fill="#14532d">Решение</text><text x="360" y="375" text-anchor="middle" class="small" fill="#14532d">следующий конкретный запрос</text>
<path d="M589 212v72H360v32" fill="none" stroke="#2563eb" stroke-width="4" marker-end="url(#arrow)"/>
<rect x="44" y="320" width="160" height="78" rx="12" class="stop"/><text x="124" y="351" text-anchor="middle" class="label" fill="#991b1b">Разрыв</text><text x="124" y="375" text-anchor="middle" class="small" fill="#991b1b">проверить collector</text>
<path d="M273 212v72H124v32" fill="none" stroke="#dc2626" stroke-width="3" marker-end="url(#red)"/>
<text x="360" y="456" text-anchor="middle" class="small">Идентификатор связывает записи, но причинность требует времени, статуса и границы операции.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -1,17 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 500" role="img" aria-labelledby="title desc">
<title id="title">Роли сигналов и границы инструментов</title>
<desc id="desc">Таблица сравнивает плановые роли лога, trace и synthetic контракта. Последняя колонка показывает, какие выводы запрещены без нового evidence.</desc>
<title id="title">Инструмент и граница вывода</title>
<desc id="desc">Таблица сопоставляет log, span, metric и trace-id с полезным вопросом и ограничением вывода.</desc>
<rect width="720" height="500" fill="#f8fafc"/>
<text x="36" y="48" fill="#172554" font-family="Arial, sans-serif" font-size="24" font-weight="700">Сигнал, инструмент, граница inference</text>
<text x="36" y="74" fill="#475569" font-family="Arial, sans-serif" font-size="15">План 2027-01 · нет реальных логов, trace или метрик</text>
<g font-family="Arial, sans-serif" font-size="14">
<rect x="36" y="104" width="648" height="48" fill="#1e3a8a" rx="6"/>
<text x="54" y="134" fill="#fff" font-weight="700">Форма input</text><text x="208" y="134" fill="#fff" font-weight="700">Можно назвать</text><text x="402" y="134" fill="#fff" font-weight="700">Нужно ещё</text><text x="548" y="134" fill="#fff" font-weight="700">Нельзя вывести</text>
<rect x="36" y="152" width="648" height="67" fill="#fff" stroke="#cbd5e1"/><text x="54" y="181" fill="#172554" font-weight="700">Лог</text><text x="208" y="181" fill="#334155">schema, поле</text><text x="402" y="181" fill="#334155">provenance</text><text x="548" y="181" fill="#991b1b">единственную причину</text>
<rect x="36" y="219" width="648" height="67" fill="#f1f5f9" stroke="#cbd5e1"/><text x="54" y="248" fill="#172554" font-weight="700">Trace</text><text x="208" y="248" fill="#334155">carrier, связь</text><text x="402" y="248" fill="#334155">граница propagation</text><text x="548" y="248" fill="#991b1b">причинность</text>
<rect x="36" y="286" width="648" height="67" fill="#fff" stroke="#cbd5e1"/><text x="54" y="315" fill="#172554" font-weight="700">Метрика</text><text x="208" y="315" fill="#334155">вопрос агрегации</text><text x="402" y="315" fill="#334155">окно и population</text><text x="548" y="315" fill="#991b1b">конкретный путь</text>
<rect x="36" y="353" width="648" height="67" fill="#f1f5f9" stroke="#cbd5e1"/><text x="54" y="382" fill="#172554" font-weight="700">Контракт</text><text x="208" y="382" fill="#334155">будущий input</text><text x="402" y="382" fill="#334155">scope и owner</text><text x="548" y="382" fill="#991b1b">что evidence собран</text>
</g>
<rect x="36" y="444" width="648" height="30" rx="7" fill="#fee2e2"/>
<text x="360" y="464" text-anchor="middle" fill="#991b1b" font-family="Arial, sans-serif" font-size="14" font-weight="700">Связь по id помогает задать вопрос, но сама не доказывает root cause</text>
<style>text{font-family:Arial,sans-serif;fill:#172554}.head{font-size:24px;font-weight:700}.cell{font-size:13px}.bold{font-size:14px;font-weight:700}.grid{stroke:#cbd5e1;stroke-width:1}</style>
<text x="36" y="48" class="head">Log, span и metric отвечают на разные вопросы</text>
<rect x="36" y="86" width="648" height="48" fill="#1e3a8a" rx="6"/><text x="54" y="116" fill="#fff" class="bold">Источник</text><text x="190" y="116" fill="#fff" class="bold">Полезный вопрос</text><text x="420" y="116" fill="#fff" class="bold">Проверить рядом</text><text x="575" y="116" fill="#fff" class="bold">Не выводить</text>
<g class="grid"><rect x="36" y="134" width="648" height="70" fill="#fff"/><rect x="36" y="204" width="648" height="70" fill="#f1f5f9"/><rect x="36" y="274" width="648" height="70" fill="#fff"/><rect x="36" y="344" width="648" height="70" fill="#f1f5f9"/></g>
<g class="cell"><text x="54" y="174" class="bold">Log</text><text x="190" y="165">что произошло в процессе?</text><text x="190" y="187">время, schema, source</text><text x="420" y="174">request-id</text><text x="575" y="174" fill="#991b1b">полную причину</text>
<text x="54" y="244" class="bold">Span</text><text x="190" y="235">какая операция и сколько?</text><text x="190" y="257">parent, status, attributes</text><text x="420" y="244">sampling, async</text><text x="575" y="244" fill="#991b1b">что она вызвала всё</text>
<text x="54" y="314" class="bold">Metric</text><text x="190" y="305">как ведёт себя population?</text><text x="190" y="327">окно, labels, p95</text><text x="420" y="314">путь запроса</text><text x="575" y="314" fill="#991b1b">один request</text>
<text x="54" y="384" class="bold">Trace-id</text><text x="190" y="375">где искать общий контекст?</text><text x="190" y="397">propagation chain</text><text x="420" y="384">пропуски записи</text><text x="575" y="384" fill="#991b1b">полную цепочку</text></g>
<rect x="36" y="442" width="648" height="30" rx="6" fill="#fee2e2"/><text x="360" y="462" text-anchor="middle" fill="#991b1b" class="bold">Совпадение ID — начало разбора, а не доказательство причинности</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,11 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля передачи synthetic evidence для HTTP и TLS</title><desc id="desc">Схема проводит датированный protocol/version question через проверки evidence, скрытого метода и запрещённого положительного заключения к будущему владельцу. Все красные ветви заканчиваются stop.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.stop{fill:#fff1f1;stroke:#bd3f3f;stroke-width:3}.out{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3z" fill="#5d7085"/></marker></defs>
<text x="50" y="55" class="h">Synthetic evidence hand-off: передать предел, не отчёт</text>
<rect x="50" y="145" width="260" height="135" rx="12" class="box"/><text x="78" y="185" class="s">1. План</text><text x="78" y="216" class="b">2027-05 / cutoff</text><text x="78" y="242" class="b">named protocol/version</text>
<rect x="440" y="145" width="300" height="135" rx="12" class="box"/><text x="470" y="185" class="s">2. Evidence limit</text><text x="470" y="216" class="b">not-collected</text><text x="470" y="242" class="b">input-bounded</text>
<rect x="870" y="145" width="280" height="135" rx="12" class="box"/><text x="900" y="185" class="s">3. Method limit</text><text x="900" y="216" class="b">command: not-run</text><text x="900" y="242" class="b">trace/config: not-collected</text>
<rect x="870" y="445" width="280" height="120" rx="12" class="out"/><text x="900" y="485" class="s">4. Hand-off</text><text x="900" y="516" class="b">future evidence owner</text><text x="900" y="542" class="b">productionEffect: not-attempted</text>
<rect x="55" y="445" width="620" height="120" rx="12" class="stop"/><text x="85" y="485" class="s">STOP</text><text x="85" y="516" class="b">undated / unnamed / stronger evidence / hidden method</text><text x="85" y="542" class="b">или positive network conclusion</text>
<path d="M310 212H440" class="line"/><path d="M740 212H870" class="line"/><path d="M1010 280V445" class="line"/><path d="M590 280V445" class="line"/>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Безопасная передача сетевой ошибки</title>
<desc id="desc">Цикл диагностики очищает вывод, фиксирует этап и проверяет одну гипотезу.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Карточка сетевой ошибки</text>
<g font-family="Arial,sans-serif">
<circle cx="150" cy="220" r="78" fill="#e0f2fe" stroke="#0284c7" stroke-width="4"/><text x="150" y="213" text-anchor="middle" font-size="23" font-weight="700" fill="#075985">Собрать</text><text x="150" y="244" text-anchor="middle" font-size="19" fill="#0c4a6e">метод · этап</text>
<circle cx="375" cy="140" r="78" fill="#fee2e2" stroke="#dc2626" stroke-width="4"/><text x="375" y="133" text-anchor="middle" font-size="23" font-weight="700" fill="#991b1b">Очистить</text><text x="375" y="164" text-anchor="middle" font-size="19" fill="#7f1d1d">token · cookie</text>
<circle cx="600" cy="220" r="78" fill="#ede9fe" stroke="#7c3aed" stroke-width="4"/><text x="600" y="213" text-anchor="middle" font-size="23" font-weight="700" fill="#5b21b6">Сверить</text><text x="600" y="244" text-anchor="middle" font-size="19" fill="#4c1d95">лог · статус</text>
<circle cx="375" cy="350" r="78" fill="#dcfce7" stroke="#16a34a" stroke-width="4"/><text x="375" y="343" text-anchor="middle" font-size="23" font-weight="700" fill="#166534">Повторить</text><text x="375" y="374" text-anchor="middle" font-size="19" fill="#14532d">один тест</text>
<path d="M220 195 292 157" stroke="#475569" stroke-width="4"/><path d="m292 157-14-2 7 13z" fill="#475569"/>
<path d="M453 157 525 195" stroke="#475569" stroke-width="4"/><path d="m525 195-7-13-7 12z" fill="#475569"/>
<path d="M560 280 435 324" stroke="#475569" stroke-width="4"/><path d="m435 324 13 5-5-14z" fill="#475569"/>
<path d="M315 324 190 280" stroke="#475569" stroke-width="4"/><path d="m190 280 5 14 8-12z" fill="#475569"/>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Факт и гипотеза хранятся раздельно.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,12 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Карта вопроса HTTP и TLS на май 2027</title><desc id="desc">Схема отделяет HTTP-семантику, framing, TLS handshake и policy клиента. Они передают только синтетический вопрос будущему владельцу; красные блоки запрещают endpoint, команду и вывод о соединении.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:20px;font-weight:700}.b{font-size:17px}.box{fill:#fff;stroke:#3976a8;stroke-width:3}.stop{fill:#fff1f1;stroke:#bd3f3f;stroke-width:3}.out{fill:#edf8f1;stroke:#2d8a59;stroke-width:3}.line{stroke:#5d7085;stroke-width:3;marker-end:url(#a)}</style><defs><marker id="a" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3z" fill="#5d7085"/></marker></defs>
<text x="52" y="54" class="h">HTTP и TLS: карта будущего вопроса, не сетевой отчёт</text>
<rect x="55" y="105" width="250" height="120" rx="12" class="box"/><text x="80" y="145" class="s">HTTP semantics</text><text x="80" y="176" class="b">method / status / header</text><text x="80" y="202" class="b">не observed message</text>
<rect x="55" y="310" width="250" height="120" rx="12" class="box"/><text x="80" y="350" class="s">HTTP framing</text><text x="80" y="381" class="b">named version question</text><text x="80" y="407" class="b">не wire bytes</text>
<rect x="450" y="105" width="270" height="120" rx="12" class="box"/><text x="478" y="145" class="s">TLS handshake</text><text x="478" y="176" class="b">named TLS boundary</text><text x="478" y="202" class="b">не certificate/result</text>
<rect x="450" y="310" width="270" height="120" rx="12" class="box"/><text x="478" y="350" class="s">Client policy</text><text x="478" y="381" class="b">trust / proxy question</text><text x="478" y="407" class="b">не hidden config</text>
<rect x="860" y="185" width="280" height="140" rx="12" class="out"/><text x="890" y="228" class="s">Hand-off</text><text x="890" y="259" class="b">2027-05 / cutoff</text><text x="890" y="285" class="b">productionEffect: not-attempted</text>
<rect x="380" y="510" width="460" height="115" rx="12" class="stop"/><text x="410" y="550" class="s">STOP</text><text x="410" y="581" class="b">endpoint, command, trace, config или «соединение успешно»</text>
<path d="M305 165H450" class="line"/><path d="M305 370H450" class="line"/><path d="M720 165H860" class="line"/><path d="M720 370H860" class="line"/><path d="M590 430V510" class="line"/>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="480" viewBox="0 0 750 480" role="img" aria-labelledby="title desc">
<title id="title">Уровни HTTP и TLS</title>
<desc id="desc">Диагностическая цепочка от имени и порта через TLS к HTTP и обработчику приложения.</desc>
<rect width="750" height="480" rx="24" fill="#f8fafc"/>
<text x="40" y="52" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Где остановился запрос</text>
<g font-family="Arial,sans-serif">
<rect x="40" y="100" width="150" height="150" rx="18" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/>
<text x="115" y="145" text-anchor="middle" font-size="24" font-weight="700" fill="#075985">DNS / TCP</text>
<text x="115" y="184" text-anchor="middle" font-size="20" fill="#0c4a6e">имя</text>
<text x="115" y="214" text-anchor="middle" font-size="20" fill="#0c4a6e">и порт</text>
<path d="M200 175h35" stroke="#475569" stroke-width="4"/><path d="m235 175-12-8v16z" fill="#475569"/>
<rect x="250" y="100" width="150" height="150" rx="18" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/>
<text x="325" y="145" text-anchor="middle" font-size="24" font-weight="700" fill="#5b21b6">TLS</text>
<text x="325" y="184" text-anchor="middle" font-size="20" fill="#4c1d95">hostname</text>
<text x="325" y="214" text-anchor="middle" font-size="20" fill="#4c1d95">и SAN</text>
<path d="M410 175h35" stroke="#475569" stroke-width="4"/><path d="m445 175-12-8v16z" fill="#475569"/>
<rect x="460" y="100" width="150" height="150" rx="18" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/>
<text x="535" y="145" text-anchor="middle" font-size="24" font-weight="700" fill="#166534">HTTP</text>
<text x="535" y="184" text-anchor="middle" font-size="20" fill="#14532d">метод</text>
<text x="535" y="214" text-anchor="middle" font-size="20" fill="#14532d">путь · статус</text>
<path d="M620 175h35" stroke="#475569" stroke-width="4"/><path d="m655 175-12-8v16z" fill="#475569"/>
<rect x="670" y="100" width="40" height="150" rx="12" fill="#fef3c7" stroke="#d97706" stroke-width="3"/>
<text x="690" y="160" text-anchor="middle" font-size="18" font-weight="700" fill="#92400e" transform="rotate(90 690 160)">handler</text>
</g>
<rect x="40" y="315" width="670" height="105" rx="16" fill="#fff" stroke="#cbd5e1" stroke-width="2"/>
<text x="62" y="352" font-family="Arial,sans-serif" font-size="22" font-weight="700" fill="#172033">Правило проверки</text>
<text x="62" y="385" font-family="Arial,sans-serif" font-size="20" fill="#334155">Статус HTTP подтверждает TLS, но не наоборот.</text>
<text x="62" y="412" font-family="Arial,sans-serif" font-size="20" fill="#334155">Фиксируем первый слой, о котором есть наблюдение.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -1,16 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица границ inference для HTTP и TLS</title><desc id="desc">Табличная схема показывает, какое доказательство требуется для HTTP-семантики, framing, TLS negotiation и client policy, а также запрещает вывод о соседнем уровне.</desc>
<rect width="1200" height="720" fill="#f7fafc"/><style>text{font-family:Arial,sans-serif;fill:#172033}.h{font-size:30px;font-weight:700}.s{font-size:19px;font-weight:700}.b{font-size:16px}.head{fill:#dcecf8;stroke:#3976a8;stroke-width:2}.cell{fill:#fff;stroke:#8aa7be;stroke-width:2}.stop{fill:#fff1f1;stroke:#bd3f3f;stroke-width:2}</style>
<text x="50" y="55" class="h">Симптом не равен причине: матрица допустимого inference</text>
<rect x="50" y="100" width="250" height="70" class="head"/><rect x="300" y="100" width="290" height="70" class="head"/><rect x="590" y="100" width="320" height="70" class="head"/><rect x="910" y="100" width="240" height="70" class="head"/>
<text x="72" y="142" class="s">Класс вопроса</text><text x="328" y="142" class="s">Нужное evidence</text><text x="618" y="142" class="s">Что не следует</text><text x="938" y="142" class="s">Сейчас</text>
<rect x="50" y="170" width="250" height="105" class="cell"/><rect x="300" y="170" width="290" height="105" class="cell"/><rect x="590" y="170" width="320" height="105" class="stop"/><rect x="910" y="170" width="240" height="105" class="cell"/>
<text x="72" y="214" class="s">HTTP semantics</text><text x="328" y="208" class="b">разрешённый message</text><text x="328" y="234" class="b">context</text><text x="618" y="208" class="b">TLS причина, endpoint</text><text x="618" y="234" class="b">или peer state</text><text x="938" y="221" class="b">назвать rule</text>
<rect x="50" y="275" width="250" height="105" class="cell"/><rect x="300" y="275" width="290" height="105" class="cell"/><rect x="590" y="275" width="320" height="105" class="stop"/><rect x="910" y="275" width="240" height="105" class="cell"/>
<text x="72" y="319" class="s">HTTP framing</text><text x="328" y="313" class="b">versioned wire</text><text x="328" y="339" class="b">mapping</text><text x="618" y="313" class="b">header meaning или</text><text x="618" y="339" class="b">client policy</text><text x="938" y="326" class="b">назвать version</text>
<rect x="50" y="380" width="250" height="105" class="cell"/><rect x="300" y="380" width="290" height="105" class="cell"/><rect x="590" y="380" width="320" height="105" class="stop"/><rect x="910" y="380" width="240" height="105" class="cell"/>
<text x="72" y="424" class="s">TLS negotiation</text><text x="328" y="418" class="b">разрешённый</text><text x="328" y="444" class="b">handshake material</text><text x="618" y="418" class="b">HTTP status или</text><text x="618" y="444" class="b">application outcome</text><text x="938" y="431" class="b">назвать boundary</text>
<rect x="50" y="485" width="250" height="105" class="cell"/><rect x="300" y="485" width="290" height="105" class="cell"/><rect x="590" y="485" width="320" height="105" class="stop"/><rect x="910" y="485" width="240" height="105" class="cell"/>
<text x="72" y="529" class="s">Client policy</text><text x="328" y="523" class="b">явная client</text><text x="328" y="549" class="b">configuration</text><text x="618" y="523" class="b">identity peer или</text><text x="618" y="549" class="b">network fault</text><text x="938" y="536" class="b">hand-off only</text>
<text x="50" y="655" class="b">Красные ячейки: запрещённый вывод о соседнем уровне. P111 не содержит наблюдений или diagnosis.</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Матрица сетевых симптомов</title>
<desc id="desc">Три симптома связаны с уровнем запроса и первой проверкой.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Симптом → граница → проверка</text>
<g font-family="Arial,sans-serif" font-size="20">
<rect x="38" y="82" width="674" height="58" rx="10" fill="#1e293b"/>
<text x="58" y="119" fill="#fff" font-weight="700">Симптом</text><text x="290" y="119" fill="#fff" font-weight="700">Граница</text><text x="505" y="119" fill="#fff" font-weight="700">Первое действие</text>
<rect x="38" y="150" width="674" height="78" rx="8" fill="#ede9fe"/><text x="58" y="185" fill="#4c1d95">ошибка имени</text><text x="290" y="185" fill="#4c1d95">TLS</text><text x="505" y="185" fill="#4c1d95">сверить SAN</text>
<rect x="38" y="238" width="674" height="78" rx="8" fill="#dcfce7"/><text x="58" y="273" fill="#14532d">404 Not Found</text><text x="290" y="273" fill="#14532d">HTTP</text><text x="505" y="273" fill="#14532d">проверить путь</text>
<rect x="38" y="326" width="674" height="78" rx="8" fill="#fef3c7"/><text x="58" y="361" fill="#92400e">503 Service Unavailable</text><text x="290" y="361" fill="#92400e">обработчик</text><text x="505" y="361" fill="#92400e">прочитать Retry-After</text>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Не переносим ответ из одной строки в другую.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,16 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="225" viewBox="0 0 375 225" role="img" aria-labelledby="title desc">
<title id="title">Карта контракта утверждения</title>
<desc id="desc">Именованное синтетическое утверждение проходит проверку источника, происхождения, независимости и опровержимости. Скрытый или отсутствующий слой останавливает вывод.</desc>
<rect width="375" height="225" fill="#f7f9fc"/>
<g font-family="Arial, sans-serif" fill="#17233a"><text x="12" y="19" font-size="15" font-weight="700">Контракт утверждения</text><text x="12" y="34" font-size="9" fill="#4b5870">P116: форма проверки, не факт</text>
<rect x="10" y="51" width="82" height="57" rx="7" fill="#e8f0ff" stroke="#3e6bb8"/><text x="18" y="70" font-size="11" font-weight="700">1. Claim</text><text x="18" y="86" font-size="9">named literal</text><text x="18" y="99" font-size="9">не ответ</text>
<rect x="101" y="51" width="82" height="57" rx="7" fill="#eaf8f2" stroke="#23805c"/><text x="109" y="70" font-size="11" font-weight="700">2. Source</text><text x="109" y="86" font-size="9">not-collected</text><text x="109" y="99" font-size="9">hidden → stop</text>
<rect x="192" y="51" width="82" height="57" rx="7" fill="#fff6df" stroke="#aa7312"/><text x="200" y="70" font-size="11" font-weight="700">3. Origin</text><text x="200" y="86" font-size="9">activity + time</text><text x="200" y="99" font-size="9">не из prose</text>
<rect x="283" y="51" width="82" height="57" rx="7" fill="#f5ecfb" stroke="#7b4599"/><text x="291" y="70" font-size="11" font-weight="700">4. Check</text><text x="291" y="86" font-size="9">other path</text><text x="291" y="99" font-size="9">falsifier</text>
<path d="M92 79H101M183 79H192M274 79H283" stroke="#53647d" stroke-width="2" marker-end="url(#a)"/>
<rect x="43" y="138" width="127" height="48" rx="7" fill="#fff0f0" stroke="#ae3f3f"/><text x="54" y="158" font-size="12" font-weight="700" fill="#852c2c">STOP</text><text x="54" y="174" font-size="9">unnamed · hidden · claimed</text>
<rect x="205" y="138" width="127" height="48" rx="7" fill="#eaf8f2" stroke="#23805c"/><text x="216" y="158" font-size="12" font-weight="700" fill="#195d43">HAND-OFF</text><text x="216" y="174" font-size="9">not-attempted</text>
<path d="M233 108V123H106V138" fill="none" stroke="#ae3f3f" stroke-width="2" marker-end="url(#r)"/><path d="M324 108V123H268V138" fill="none" stroke="#23805c" stroke-width="2" marker-end="url(#g)"/>
<text x="12" y="211" font-size="9" fill="#4b5870">not-collected и not-tested сохраняют неизвестность.</text></g>
<defs><marker id="a" markerWidth="6" markerHeight="6" refX="5" refY="2" orient="auto"><path d="M0,0 L0,4 L6,2z" fill="#53647d"/></marker><marker id="r" markerWidth="6" markerHeight="6" refX="5" refY="2" orient="auto"><path d="M0,0 L0,4 L6,2z" fill="#ae3f3f"/></marker><marker id="g" markerWidth="6" markerHeight="6" refX="5" refY="2" orient="auto"><path d="M0,0 L0,4 L6,2z" fill="#23805c"/></marker></defs>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">HTTP deadline и фазы запроса</title>
<desc id="desc">Общий deadline распределяет оставшееся время между DNS, TLS и чтением ответа. Просроченная фаза возвращает контролируемую ошибку.</desc>
<defs><marker id="a" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#2563eb"/></marker><marker id="r" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#dc2626"/></marker></defs>
<rect width="1200" height="720" fill="#f8fafc"/>
<text x="60" y="75" fill="#17233a" font-family="Arial, sans-serif" font-size="38" font-weight="700">Общий deadline, отдельные фазы</text>
<text x="60" y="115" fill="#4b5870" font-family="Arial, sans-serif" font-size="22">Новый таймер не начинается после истечения границы операции</text>
<g font-family="Arial, sans-serif">
<rect x="70" y="220" width="230" height="150" rx="20" fill="#e8f0ff" stroke="#3e6bb8" stroke-width="3"/><text x="105" y="275" fill="#1d3f7a" font-size="27" font-weight="700">Deadline</text><text x="105" y="320" fill="#274b7c" font-size="22">800 ms</text><text x="105" y="350" fill="#53647d" font-size="18">absolute boundary</text>
<rect x="370" y="220" width="230" height="150" rx="20" fill="#eaf8f2" stroke="#23805c" stroke-width="3"/><text x="405" y="275" fill="#195d43" font-size="27" font-weight="700">DNS + TCP</text><text x="405" y="320" fill="#27745a" font-size="22">42 + 60 ms</text><text x="405" y="350" fill="#53647d" font-size="18">remaining budget</text>
<rect x="670" y="220" width="230" height="150" rx="20" fill="#fff6df" stroke="#aa7312" stroke-width="3"/><text x="705" y="275" fill="#79520b" font-size="27" font-weight="700">TLS</text><text x="705" y="320" fill="#8a6317" font-size="22">88 ms</text><text x="705" y="350" fill="#53647d" font-size="18">handshake</text>
<rect x="970" y="220" width="160" height="150" rx="20" fill="#f5ecfb" stroke="#7b4599" stroke-width="3"/><text x="1005" y="275" fill="#5d2877" font-size="27" font-weight="700">Read</text><text x="1005" y="320" fill="#744a8e" font-size="22">610 ms</text><text x="1005" y="350" fill="#53647d" font-size="18">or stop</text>
<path d="M300 295H370M600 295H670M900 295H970" stroke="#2563eb" stroke-width="6" marker-end="url(#a)"/>
<rect x="275" y="505" width="650" height="105" rx="20" fill="#fff0f0" stroke="#dc2626" stroke-width="3"/><text x="600" y="550" text-anchor="middle" fill="#852c2c" font-size="25" font-weight="700">Остаток 0 ms → deadline-exceeded</text><text x="600" y="583" text-anchor="middle" fill="#a04444" font-size="20">не выдавать фазе новый полный timeout</text>
<path d="M1080 370V470H925V505" fill="none" stroke="#dc2626" stroke-width="5" marker-end="url(#r)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,14 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="225" viewBox="0 0 375 225" role="img" aria-labelledby="title desc">
<title id="title">Петля редакционного hand-off</title>
<desc id="desc">Временная граница, контракт утверждения и состояния evidence образуют hand-off без создания интервью, transcript, speaker, approval или publication.</desc>
<rect width="375" height="225" fill="#f7f9fc"/>
<g font-family="Arial, sans-serif" fill="#17233a"><text x="10" y="19" font-size="15" font-weight="700">Hand-off без fabricated record</text>
<rect x="12" y="52" width="91" height="66" rx="12" fill="#e8f0ff" stroke="#3e6bb8"/><text x="27" y="76" font-size="12" font-weight="700" fill="#1d3f7a">Dates</text><text x="21" y="94" font-size="9">2026-07-31</text><text x="31" y="108" font-size="9">2027-10</text>
<rect x="141" y="52" width="91" height="66" rx="12" fill="#fff6df" stroke="#aa7312"/><text x="151" y="76" font-size="12" font-weight="700" fill="#79520b">Assertion</text><text x="151" y="94" font-size="9">named literal</text><text x="151" y="108" font-size="9">без ответа</text>
<rect x="270" y="52" width="91" height="66" rx="12" fill="#f5ecfb" stroke="#7b4599"/><text x="280" y="76" font-size="12" font-weight="700" fill="#5d2877">Evidence</text><text x="280" y="94" font-size="9">not-collected</text><text x="280" y="108" font-size="9">not-tested</text>
<path d="M103 85H141M232 85H270" stroke="#53647d" stroke-width="2" marker-end="url(#a)"/>
<rect x="112" y="142" width="151" height="43" rx="8" fill="#eaf8f2" stroke="#23805c"/><text x="127" y="161" font-size="12" font-weight="700" fill="#195d43">HAND-OFF</text><text x="127" y="177" font-size="9">synthetic plan / not-attempted</text>
<path d="M316 118V130H188V142" fill="none" stroke="#23805c" stroke-width="2" marker-end="url(#g)"/>
<rect x="32" y="195" width="311" height="19" rx="5" fill="#fff0f0" stroke="#ae3f3f"/><text x="42" y="208" font-size="9" fill="#852c2c">Не создаются: transcript · speaker · approval · publication</text></g>
<defs><marker id="a" markerWidth="6" markerHeight="6" refX="5" refY="2" orient="auto"><path d="M0,0 L0,4 L6,2z" fill="#53647d"/></marker><marker id="g" markerWidth="6" markerHeight="6" refX="5" refY="2" orient="auto"><path d="M0,0 L0,4 L6,2z" fill="#23805c"/></marker></defs>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Передача traceparent через HTTP</title>
<desc id="desc">Клиент передаёт traceparent gateway, gateway сохраняет контекст, а сервис проверяет формат и создаёт локальный span.</desc>
<defs><marker id="a" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#23805c"/></marker><marker id="r" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#ae3f3f"/></marker></defs>
<rect width="1200" height="720" fill="#f7f9fc"/>
<text x="60" y="75" fill="#17233a" font-family="Arial, sans-serif" font-size="38" font-weight="700">Trace Context на границе proxy</text>
<text x="60" y="115" fill="#4b5870" font-family="Arial, sans-serif" font-size="22">Заголовок связывает события, но не является правом доступа</text>
<g font-family="Arial, sans-serif" text-anchor="middle">
<rect x="70" y="235" width="250" height="145" rx="22" fill="#e8f0ff" stroke="#3e6bb8" stroke-width="3"/><text x="195" y="288" fill="#1d3f7a" font-size="27" font-weight="700">Клиент</text><text x="195" y="328" fill="#274b7c" font-size="19">traceparent</text><text x="195" y="355" fill="#53647d" font-size="18">valid header</text>
<rect x="475" y="235" width="250" height="145" rx="22" fill="#fff6df" stroke="#aa7312" stroke-width="3"/><text x="600" y="288" fill="#79520b" font-size="27" font-weight="700">Gateway</text><text x="600" y="328" fill="#8a6317" font-size="19">allow + forward</text><text x="600" y="355" fill="#53647d" font-size="18">same trace-id</text>
<rect x="880" y="235" width="250" height="145" rx="22" fill="#eaf8f2" stroke="#23805c" stroke-width="3"/><text x="1005" y="288" fill="#195d43" font-size="27" font-weight="700">Service</text><text x="1005" y="328" fill="#27745a" font-size="19">parse + new span</text><text x="1005" y="355" fill="#53647d" font-size="18">structured logs</text>
<path d="M320 307H475M725 307H880" stroke="#23805c" stroke-width="6" marker-end="url(#a)"/>
<rect x="300" y="520" width="600" height="100" rx="18" fill="#fff0f0" stroke="#ae3f3f" stroke-width="3"/><text x="600" y="563" fill="#852c2c" font-size="25" font-weight="700">invalid header → local fallback</text><text x="600" y="595" fill="#a04444" font-size="19">не использовать trace-id для авторизации</text>
<path d="M1005 380V475H900V520" fill="none" stroke="#ae3f3f" stroke-width="5" marker-end="url(#r)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,14 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="225" viewBox="0 0 375 225" role="img" aria-labelledby="title desc">
<title id="title">Матрица границ evidence и provenance</title>
<desc id="desc">Пять строк отличают утверждение, evidence, происхождение, независимое подтверждение и опровержимость. Скрытый слой не повышает уверенность.</desc>
<rect width="375" height="225" fill="#f8fafc"/>
<g font-family="Arial, sans-serif" fill="#17233a"><text x="10" y="18" font-size="15" font-weight="700">Evidence ≠ связный рассказ</text>
<rect x="10" y="29" width="355" height="24" rx="4" fill="#203b68"/><text x="18" y="45" font-size="10" font-weight="700" fill="#fff">Слой</text><text x="93" y="45" font-size="10" font-weight="700" fill="#fff">Вопрос</text><text x="243" y="45" font-size="10" font-weight="700" fill="#fff">Граница P116</text>
<g stroke="#9ba8bc" stroke-width=".6"><rect x="10" y="53" width="355" height="25" fill="#edf3ff"/><rect x="10" y="78" width="355" height="25" fill="#fff"/><rect x="10" y="103" width="355" height="25" fill="#edf3ff"/><rect x="10" y="128" width="355" height="25" fill="#fff"/><rect x="10" y="153" width="355" height="25" fill="#edf3ff"/><path d="M82 29V178M233 29V178"/></g>
<text x="18" y="69" font-size="9" font-weight="700">Claim</text><text x="93" y="69" font-size="9">Что сказано?</text><text x="243" y="69" font-size="9">not-collected</text>
<text x="18" y="94" font-size="9" font-weight="700">Evidence</text><text x="93" y="94" font-size="9">Чем проверить?</text><text x="243" y="94" font-size="9">нет substitute</text>
<text x="18" y="119" font-size="9" font-weight="700">Origin</text><text x="93" y="119" font-size="9">Откуда?</text><text x="243" y="119" font-size="9">не из prose</text>
<text x="18" y="144" font-size="9" font-weight="700">Other path</text><text x="93" y="144" font-size="9">Независим?</text><text x="243" y="144" font-size="9">повтор не source</text>
<text x="18" y="169" font-size="9" font-weight="700">Falsifier</text><text x="93" y="169" font-size="9">Что сузит?</text><text x="243" y="169" font-size="9">not-tested</text>
<rect x="10" y="192" width="355" height="22" rx="5" fill="#fff0f0" stroke="#ae3f3f"/><text x="19" y="207" font-size="9" font-weight="700" fill="#852c2c">hidden / claimed / fabricated → STOP</text></g>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица проверки TLS-сертификата</title>
<desc id="desc">Матрица разделяет срок действия, имя SAN, цепочку доверия и алгоритм. Успешный TLS-канал не означает совпадение всех проверок.</desc>
<rect width="1200" height="720" fill="#f8fafc"/>
<text x="58" y="72" fill="#17233a" font-family="Arial, sans-serif" font-size="38" font-weight="700">Сертификат: четыре независимые проверки</text>
<text x="58" y="112" fill="#4b5870" font-family="Arial, sans-serif" font-size="22">Шифрование канала не заменяет доверие к имени и цепочке</text>
<g font-family="Arial, sans-serif" font-size="21">
<rect x="58" y="155" width="1084" height="62" fill="#203b68"/><text x="88" y="195" fill="#fff" font-weight="700">Слой</text><text x="350" y="195" fill="#fff" font-weight="700">Вопрос</text><text x="700" y="195" fill="#fff" font-weight="700">Отказ</text><text x="970" y="195" fill="#fff" font-weight="700">Собрать</text>
<g stroke="#9ba8bc" stroke-width="2"><rect x="58" y="217" width="1084" height="78" fill="#edf3ff"/><rect x="58" y="295" width="1084" height="78" fill="#fff"/><rect x="58" y="373" width="1084" height="78" fill="#edf3ff"/><rect x="58" y="451" width="1084" height="78" fill="#fff"/></g>
<g fill="#25344d"><text x="88" y="264" font-weight="700">Срок</text><text x="350" y="264">now внутри окна?</text><text x="700" y="264">expired</text><text x="970" y="264">UTC clock</text><text x="88" y="342" font-weight="700">SAN</text><text x="350" y="342">host совпал?</text><text x="700" y="342">hostname mismatch</text><text x="970" y="342">SNI + имя</text><text x="88" y="420" font-weight="700">Цепочка</text><text x="350" y="420">есть trusted root?</text><text x="700" y="420">unknown issuer</text><text x="970" y="420">leaf + intermediate</text><text x="88" y="498" font-weight="700">Policy</text><text x="350" y="498">алгоритм разрешён?</text><text x="700" y="498">algorithm error</text><text x="970" y="498">TLS settings</text></g>
<rect x="58" y="580" width="1084" height="72" rx="16" fill="#14532d"/><text x="600" y="625" text-anchor="middle" fill="#dcfce7" font-weight="700">Не отключать verify: исправлять конкретный слой</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,16 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля передачи самостоятельности</title>
<desc id="desc">Схема показывает проверку дат, именованного literal и отсутствия evidence. Назначенный владелец или claimed feedback останавливают проверку; допустимый результат передаёт только неоценённую самостоятельность.</desc>
<title id="title">Маршрут review API-изменения</title>
<desc id="desc">Маршрут проходит от diff схемы к классификации, проверке потребителей и обратимой миграции. Удаление старого формата останавливается при неизвестном потребителе.</desc>
<defs><marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#93c5fd"/></marker><marker id="red" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#fb7185"/></marker></defs>
<rect width="1200" height="720" fill="#0b1220"/>
<text x="60" y="78" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Hand-off без назначения и выдуманного feedback</text>
<text x="60" y="76" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Review API-diff: от риска к обратимости</text>
<text x="60" y="116" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">Новая форма не должна лишать старого клиента пути чтения</text>
<g font-family="Arial, sans-serif" text-anchor="middle">
<rect x="80" y="250" width="220" height="130" rx="22" fill="#172554" stroke="#60a5fa" stroke-width="3"/><text x="190" y="302" fill="#dbeafe" font-size="24" font-weight="700">Даты</text><text x="190" y="342" fill="#bfdbfe" font-size="19">2026-07-31 / 2027-09</text>
<rect x="380" y="250" width="220" height="130" rx="22" fill="#172554" stroke="#60a5fa" stroke-width="3"/><text x="490" y="302" fill="#dbeafe" font-size="24" font-weight="700">Literal</text><text x="490" y="342" fill="#bfdbfe" font-size="19">named synthetic only</text>
<rect x="680" y="250" width="220" height="130" rx="22" fill="#172554" stroke="#60a5fa" stroke-width="3"/><text x="790" y="302" fill="#dbeafe" font-size="24" font-weight="700">Evidence</text><text x="790" y="342" fill="#bfdbfe" font-size="19">not-collected</text>
<rect x="980" y="250" width="140" height="130" rx="22" fill="#14532d" stroke="#4ade80" stroke-width="3"/><text x="1050" y="298" fill="#dcfce7" font-size="21" font-weight="700">Hand-off</text><text x="1050" y="334" fill="#bbf7d0" font-size="17">not-evaluated</text>
<path d="M300 315H380M600 315H680M900 315H980" stroke="#60a5fa" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="300" y="510" width="600" height="105" rx="20" fill="#7f1d1d" stroke="#f87171" stroke-width="3"/><text x="600" y="555" fill="#fee2e2" font-size="25" font-weight="700">owner assigned или feedback claimed → stop</text><text x="600" y="590" fill="#fecaca" font-size="19">process остаётся not-created, recipient — not-assigned</text>
<path d="M790 380V510" stroke="#f87171" stroke-width="5" marker-end="url(#redArrow)"/>
<rect x="55" y="240" width="230" height="135" rx="20" fill="#172554" stroke="#60a5fa" stroke-width="3"/><text x="170" y="295" fill="#dbeafe" font-size="25" font-weight="700">Diff схемы</text><text x="170" y="335" fill="#bfdbfe" font-size="19">removed · required · enum</text>
<rect x="340" y="240" width="230" height="135" rx="20" fill="#164e63" stroke="#67e8f9" stroke-width="3"/><text x="455" y="295" fill="#cffafe" font-size="25" font-weight="700">Класс риска</text><text x="455" y="335" fill="#a5f3fc" font-size="19">compatible / breaking</text>
<rect x="625" y="240" width="230" height="135" rx="20" fill="#365314" stroke="#a3e635" stroke-width="3"/><text x="740" y="295" fill="#ecfccb" font-size="25" font-weight="700">Потребители</text><text x="740" y="335" fill="#d9f99d" font-size="19">SDK · tests · events</text>
<rect x="910" y="240" width="230" height="135" rx="20" fill="#14532d" stroke="#4ade80" stroke-width="3"/><text x="1025" y="295" fill="#dcfce7" font-size="25" font-weight="700">Expand → switch</text><text x="1025" y="335" fill="#bbf7d0" font-size="19">→ contract</text>
<path d="M285 307H340M570 307H625M855 307H910" stroke="#93c5fd" stroke-width="6" marker-end="url(#arrow)"/>
<rect x="270" y="510" width="660" height="100" rx="18" fill="#7f1d1d" stroke="#fb7185" stroke-width="3"/><text x="600" y="553" fill="#ffe4e6" font-size="25" font-weight="700">Неизвестный consumer → остановить удаление</text><text x="600" y="586" fill="#fecdd3" font-size="20">rollback файла не возвращает потерянные данные</text>
<path d="M740 375V510" stroke="#fb7185" stroke-width="5" marker-end="url(#red)"/>
</g>
<defs><marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#60a5fa"/></marker><marker id="redArrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#f87171"/></marker></defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -1,13 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица статусов practice и review</title>
<desc id="desc">Таблица показывает, что prompt не запущен, а observation, review, feedback и progress не собраны или не заявлены. Любое claimed значение прекращает проверку.</desc>
<title id="title">Матрица слоёв валидации</title>
<desc id="desc">Таблица разделяет форму JSON, связь полей, состояние ресурса и право доступа. Для каждого слоя указаны вход и класс ошибки.</desc>
<rect width="1200" height="720" fill="#111827"/>
<text x="60" y="75" fill="#f9fafb" font-family="Arial, sans-serif" font-size="37" font-weight="700">Practice / review: что известно literal, а что нет</text>
<g font-family="Arial, sans-serif" font-size="22">
<rect x="60" y="125" width="1080" height="72" fill="#1d4ed8"/>
<text x="95" y="170" fill="#eff6ff">Поле</text><text x="420" y="170" fill="#eff6ff">Статус P115</text><text x="780" y="170" fill="#eff6ff">Claimed значение</text>
<g fill="#1f2937" stroke="#475569" stroke-width="2"><rect x="60" y="197" width="1080" height="76"/><rect x="60" y="273" width="1080" height="76"/><rect x="60" y="349" width="1080" height="76"/><rect x="60" y="425" width="1080" height="76"/><rect x="60" y="501" width="1080" height="76"/></g>
<g fill="#e5e7eb"><text x="95" y="244">Prompt</text><text x="420" y="244">not-run</text><text x="780" y="244">не доказывает выполнение</text><text x="95" y="320">Observation</text><text x="420" y="320">not-collected</text><text x="780" y="320">stop</text><text x="95" y="396">Review</text><text x="420" y="396">not-collected</text><text x="780" y="396">stop</text><text x="95" y="472">Feedback</text><text x="420" y="472">not-collected</text><text x="780" y="472">stop</text><text x="95" y="548">Progress</text><text x="420" y="548">not-claimed</text><text x="780" y="548">stop</text></g>
<rect x="60" y="622" width="1080" height="48" rx="12" fill="#7f1d1d"/><text x="600" y="654" text-anchor="middle" fill="#fee2e2">Нет reviewer, mentee, feedback, outcome или учебного процесса</text>
<text x="58" y="72" fill="#f9fafb" font-family="Arial, sans-serif" font-size="38" font-weight="700">Валидация: четыре слоя, четыре вопроса</text>
<text x="58" y="110" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">JSON Schema не заменяет проверку состояния и авторизацию</text>
<g font-family="Arial, sans-serif" font-size="21">
<rect x="58" y="150" width="1084" height="62" fill="#1d4ed8"/><text x="88" y="190" fill="#eff6ff" font-weight="700">Слой</text><text x="350" y="190" fill="#eff6ff" font-weight="700">Вопрос</text><text x="690" y="190" fill="#eff6ff" font-weight="700">Пример</text><text x="970" y="190" fill="#eff6ff" font-weight="700">Ошибка</text>
<g stroke="#475569" stroke-width="2"><rect x="58" y="212" width="1084" height="76" fill="#1f2937"/><rect x="58" y="288" width="1084" height="76" fill="#243248"/><rect x="58" y="364" width="1084" height="76" fill="#1f2937"/><rect x="58" y="440" width="1084" height="76" fill="#243248"/></g>
<g fill="#e5e7eb"><text x="88" y="258" font-weight="700">Форма</text><text x="350" y="258">JSON читается?</text><text x="690" y="258">limit: integer</text><text x="970" y="258">400</text><text x="88" y="334" font-weight="700">Инвариант</text><text x="350" y="334">Поля согласованы?</text><text x="690" y="334">from ≤ to</text><text x="970" y="334">400</text><text x="88" y="410" font-weight="700">Состояние</text><text x="350" y="410">Ресурс ещё тот?</text><text x="690" y="410">revision совпала</text><text x="970" y="410">409</text><text x="88" y="486" font-weight="700">Право</text><text x="350" y="486">Можно менять?</text><text x="690" y="486">роль + ресурс</text><text x="970" y="486">403</text></g>
<rect x="58" y="560" width="1084" height="76" rx="16" fill="#14532d"/><text x="600" y="607" text-anchor="middle" fill="#dcfce7" font-weight="700">Слой определяет вход, сообщение и следующий шаг клиента</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,31 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Контракт синтетической карты навыка</title>
<desc id="desc">Три карточки показывают именованную карту, не запущенный prompt и отсутствие наблюдения. Красная ветка останавливает неявное умение.</desc>
<title id="title">Контракт HTTP-ответа</title>
<desc id="desc">Поток показывает endpoint, проверку JSON-формы и потребителя. Неверный тип или значение enum останавливает ответ до клиентского кода.</desc>
<defs><marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#64b5f6"/></marker><marker id="stop" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#fb7185"/></marker></defs>
<rect width="1200" height="720" fill="#0f172a"/>
<text x="70" y="82" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Карта навыка — контракт, не оценка человека</text>
<text x="70" y="122" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">P115 · plan/scenario · 2027-09 · только fixed in-memory literal</text>
<text x="64" y="76" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">API-ответ: форма → проверка → клиент</text>
<text x="64" y="116" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">Контракт отделяет JSON-тип от бизнес-правила и состояния ресурса</text>
<g font-family="Arial, sans-serif">
<rect x="70" y="205" width="300" height="210" rx="18" fill="#172554" stroke="#60a5fa" stroke-width="3"/>
<text x="100" y="260" fill="#bfdbfe" font-size="24" font-weight="700">Карта</text>
<text x="100" y="310" fill="#fff" font-size="21">synthetic-skill-map</text>
<text x="100" y="346" fill="#cbd5e1" font-size="20">named-synthetic-only</text>
<rect x="450" y="205" width="300" height="210" rx="18" fill="#172554" stroke="#60a5fa" stroke-width="3"/>
<text x="480" y="260" fill="#bfdbfe" font-size="24" font-weight="700">Prompt</text>
<text x="480" y="310" fill="#fff" font-size="21">synthetic-practice</text>
<text x="480" y="346" fill="#cbd5e1" font-size="20">not-run</text>
<rect x="830" y="205" width="300" height="210" rx="18" fill="#172554" stroke="#60a5fa" stroke-width="3"/>
<text x="860" y="260" fill="#bfdbfe" font-size="24" font-weight="700">Наблюдение</text>
<text x="860" y="310" fill="#fff" font-size="21">observation</text>
<text x="860" y="346" fill="#cbd5e1" font-size="20">not-collected</text>
<path d="M370 310H450M750 310H830" stroke="#60a5fa" stroke-width="5" marker-end="url(#arrow)"/>
<rect x="260" y="510" width="680" height="115" rx="18" fill="#14532d" stroke="#4ade80" stroke-width="3"/>
<text x="600" y="555" text-anchor="middle" fill="#dcfce7" font-size="25" font-weight="700">synthetic-plan-hand-off</text>
<text x="600" y="592" text-anchor="middle" fill="#bbf7d0" font-size="20">productionEffect: not-attempted</text>
<path d="M600 415V510" stroke="#4ade80" stroke-width="5" marker-end="url(#arrowGreen)"/>
<rect x="70" y="510" width="150" height="115" rx="18" fill="#7f1d1d" stroke="#f87171" stroke-width="3"/>
<text x="145" y="554" text-anchor="middle" fill="#fee2e2" font-size="20" font-weight="700">implicit</text>
<text x="145" y="588" text-anchor="middle" fill="#fecaca" font-size="18">skill → stop</text>
<path d="M220 565H260" stroke="#f87171" stroke-width="5"/>
<rect x="70" y="220" width="280" height="180" rx="20" fill="#172554" stroke="#60a5fa" stroke-width="3"/><text x="105" y="275" fill="#dbeafe" font-size="27" font-weight="700">Endpoint</text><text x="105" y="320" fill="#fff" font-size="23">GET /customers/{id}</text><text x="105" y="360" fill="#bfdbfe" font-size="20">status 200 · JSON</text>
<rect x="460" y="220" width="280" height="180" rx="20" fill="#164e63" stroke="#67e8f9" stroke-width="3"/><text x="495" y="275" fill="#cffafe" font-size="27" font-weight="700">Форма</text><text x="495" y="320" fill="#fff" font-size="22">id · revision · state</text><text x="495" y="360" fill="#a5f3fc" font-size="20">type + required + enum</text>
<rect x="850" y="220" width="280" height="180" rx="20" fill="#14532d" stroke="#4ade80" stroke-width="3"/><text x="885" y="275" fill="#dcfce7" font-size="27" font-weight="700">Потребитель</text><text x="885" y="320" fill="#fff" font-size="22">нормализованный объект</text><text x="885" y="360" fill="#bbf7d0" font-size="20">или ясная причина отказа</text>
<path d="M350 310H460M740 310H850" stroke="#64b5f6" stroke-width="6" marker-end="url(#arrow)"/>
<rect x="290" y="510" width="620" height="100" rx="18" fill="#7f1d1d" stroke="#fb7185" stroke-width="3"/><text x="600" y="553" text-anchor="middle" fill="#ffe4e6" font-size="25" font-weight="700">Неверный тип или enum → отказ</text><text x="600" y="586" text-anchor="middle" fill="#fecdd3" font-size="20">не подставлять отсутствующее обязательное поле</text>
<path d="M600 400V510" stroke="#fb7185" stroke-width="5" marker-end="url(#stop)"/>
</g>
<defs><marker id="arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#60a5fa"/></marker><marker id="arrowGreen" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#4ade80"/></marker></defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -1,16 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Временная граница пересмотра совета</title>
<desc id="desc">Схема показывает editor date 31 июля 2026 года, source cutoff той же даты и будущую plan date ноября 2027 года. Между ними расположены вопросы о claim, condition и immutable evidence; заявленного прошлого совета и результата нет.</desc>
<title id="title">Фазы expand switch contract</title>
<desc id="desc">Временная линия показывает добавление совместимой формы, двойную запись, переключение чтения и удаление старой формы только после проверки.</desc>
<rect width="1200" height="720" fill="#101827"/>
<text x="64" y="78" fill="#f8fafc" font-family="Arial, sans-serif" font-size="40" font-weight="700">Сначала рамка, затем вопрос о совете</text>
<text x="64" y="118" fill="#b8c6dc" font-family="Arial, sans-serif" font-size="22">P117 · future-only сценарий · нет цитаты, статьи, теста или коррекции</text>
<line x1="110" y1="270" x2="1090" y2="270" stroke="#5d7394" stroke-width="8" stroke-linecap="round"/>
<circle cx="190" cy="270" r="28" fill="#7dd3fc"/><circle cx="520" cy="270" r="28" fill="#a7f3d0"/><circle cx="1010" cy="270" r="28" fill="#fbbf24"/>
<text x="120" y="330" fill="#e0f2fe" font-family="Arial, sans-serif" font-size="24" font-weight="700">editor date</text><text x="104" y="362" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">2026-07-31</text>
<text x="437" y="330" fill="#d1fae5" font-family="Arial, sans-serif" font-size="24" font-weight="700">source cutoff</text><text x="434" y="362" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">2026-07-31</text>
<text x="928" y="330" fill="#fef3c7" font-family="Arial, sans-serif" font-size="24" font-weight="700">plan date</text><text x="932" y="362" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="22">2027-11</text>
<rect x="92" y="454" width="300" height="136" rx="18" fill="#172a46" stroke="#7dd3fc" stroke-width="2"/><text x="122" y="500" fill="#e0f2fe" font-family="Arial, sans-serif" font-size="25" font-weight="700">Claim question</text><text x="122" y="539" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="20">named · not-collected</text>
<rect x="450" y="454" width="300" height="136" rx="18" fill="#173b38" stroke="#a7f3d0" stroke-width="2"/><text x="480" y="500" fill="#d1fae5" font-family="Arial, sans-serif" font-size="25" font-weight="700">Condition question</text><text x="480" y="539" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="20">version / applicability unknown</text>
<rect x="808" y="454" width="300" height="136" rx="18" fill="#44371b" stroke="#fbbf24" stroke-width="2"/><text x="838" y="500" fill="#fef3c7" font-family="Arial, sans-serif" font-size="25" font-weight="700">Evidence question</text><text x="838" y="539" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="20">immutable pin required</text>
<text x="64" y="650" fill="#fda4af" font-family="Arial, sans-serif" font-size="20" font-weight="700"><tspan x="64" dy="0">Запрещённый вывод: существовал старый совет, найдено основание,</tspan><tspan x="64" dy="28">выполнен repro или сделана коррекция.</tspan></text>
<text x="60" y="75" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Миграция схемы: совместимые фазы</text>
<text x="60" y="115" fill="#b8c6dc" font-family="Arial, sans-serif" font-size="22">Старый и новый код должны сосуществовать до удаления формы</text>
<line x1="120" y1="300" x2="1080" y2="300" stroke="#5d7394" stroke-width="8" stroke-linecap="round"/>
<g font-family="Arial, sans-serif" text-anchor="middle">
<circle cx="190" cy="300" r="30" fill="#7dd3fc"/><circle cx="480" cy="300" r="30" fill="#a7f3d0"/><circle cx="770" cy="300" r="30" fill="#fbbf24"/><circle cx="1010" cy="300" r="30" fill="#fb7185"/>
<text x="190" y="365" fill="#e0f2fe" font-size="25" font-weight="700">Expand</text><text x="190" y="397" fill="#cbd5e1" font-size="19">добавить поле</text>
<text x="480" y="365" fill="#d1fae5" font-size="25" font-weight="700">Dual write</text><text x="480" y="397" fill="#cbd5e1" font-size="19">обе формы</text>
<text x="770" y="365" fill="#fef3c7" font-size="25" font-weight="700">Switch</text><text x="770" y="397" fill="#cbd5e1" font-size="19">новое чтение</text>
<text x="1010" y="365" fill="#ffe4e6" font-size="25" font-weight="700">Contract</text><text x="1010" y="397" fill="#cbd5e1" font-size="19">удалить старое</text>
<rect x="200" y="510" width="800" height="100" rx="18" fill="#173b38" stroke="#86efac" stroke-width="3"/><text x="600" y="553" fill="#d1fae5" font-size="25" font-weight="700">Проверка данных и потребителей</text><text x="600" y="586" fill="#bbf7d0" font-size="20">нужна до contract и до окончательного rollback</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -1,11 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица условия и коррекции для планового пересмотра</title>
<desc id="desc">Матрица разделяет claim, condition, evidence, contradiction, repro и correction. Допустимы только named questions и плановая передача; mutable evidence, injected repro и declared correction останавливаются.</desc>
<title id="title">Матрица решения о retry</title>
<desc id="desc">Матрица связывает HTTP-метод, статус, право на повтор и идемпотентность. Backoff и jitter применяются только после проверки семантики.</desc>
<rect width="1200" height="720" fill="#131522"/>
<text x="54" y="70" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Сравнение начинается до verdict-а</text>
<text x="54" y="110" fill="#b8c6dc" font-family="Arial, sans-serif" font-size="22">P117 · condition и contradiction не заменяют друг друга</text>
<rect x="54" y="158" width="1092" height="64" rx="12" fill="#28364f"/><text x="82" y="199" fill="#e2e8f0" font-family="Arial, sans-serif" font-size="23" font-weight="700">Слой</text><text x="365" y="199" fill="#e2e8f0" font-family="Arial, sans-serif" font-size="23" font-weight="700">Допустимая форма</text><text x="750" y="199" fill="#e2e8f0" font-family="Arial, sans-serif" font-size="23" font-weight="700">Fail-closed граница</text>
<g font-family="Arial, sans-serif" font-size="21"><rect x="54" y="232" width="1092" height="62" fill="#1c2940"/><text x="82" y="271" fill="#dbeafe">Claim</text><text x="365" y="271" fill="#bbf7d0">named question-only</text><text x="750" y="271" fill="#fecaca">unnamed или declared claim</text><rect x="54" y="296" width="1092" height="62" fill="#202d44"/><text x="82" y="335" fill="#dbeafe">Condition</text><text x="365" y="335" fill="#bbf7d0">version / applicability not-collected</text><text x="750" y="335" fill="#fecaca">версия из памяти</text><rect x="54" y="360" width="1092" height="62" fill="#1c2940"/><text x="82" y="399" fill="#dbeafe">Evidence</text><text x="365" y="399" fill="#bbf7d0">immutable version or dated snapshot</text><text x="750" y="399" fill="#fecaca">mutable current document</text><rect x="54" y="424" width="1092" height="62" fill="#202d44"/><text x="82" y="463" fill="#dbeafe">Contradiction / repro</text><text x="365" y="463" fill="#bbf7d0">not-collected / not-run</text><text x="750" y="463" fill="#fecaca">injected repro result</text><rect x="54" y="488" width="1092" height="62" fill="#1c2940"/><text x="82" y="527" fill="#dbeafe">Correction / outcome</text><text x="365" y="527" fill="#bbf7d0">not-declared</text><text x="750" y="527" fill="#fecaca">declared correct or complete</text></g>
<path d="M600 590 L600 642" stroke="#86efac" stroke-width="5"/><path d="M588 628 L600 644 L612 628" fill="none" stroke="#86efac" stroke-width="5"/>
<text x="426" y="689" fill="#bbf7d0" font-family="Arial, sans-serif" font-size="26" font-weight="700">Только synthetic-plan-hand-off · effect not-attempted</text>
<text x="54" y="70" fill="#f8fafc" font-family="Arial, sans-serif" font-size="38" font-weight="700">Retry начинается с семантики</text>
<text x="54" y="110" fill="#b8c6dc" font-family="Arial, sans-serif" font-size="22">Задержка не делает небезопасную запись идемпотентной</text>
<g font-family="Arial, sans-serif" font-size="21">
<rect x="54" y="158" width="1092" height="62" rx="12" fill="#28364f"/><text x="82" y="198" fill="#e2e8f0" font-weight="700">Сигнал</text><text x="330" y="198" fill="#e2e8f0" font-weight="700">Решение</text><text x="640" y="198" fill="#e2e8f0" font-weight="700">Задержка</text><text x="930" y="198" fill="#e2e8f0" font-weight="700">Риск</text>
<g stroke="#475569" stroke-width="2"><rect x="54" y="220" width="1092" height="70" fill="#1c2940"/><rect x="54" y="290" width="1092" height="70" fill="#202d44"/><rect x="54" y="360" width="1092" height="70" fill="#1c2940"/><rect x="54" y="430" width="1092" height="70" fill="#202d44"/></g>
<g fill="#e2e8f0"><text x="82" y="263" font-weight="700">429</text><text x="330" y="263">только safe/idempotent</text><text x="640" y="263">Retry-After</text><text x="930" y="263">вторая волна</text><text x="82" y="333" font-weight="700">503</text><text x="330" y="333">ограниченный retry</text><text x="640" y="333">backoff + jitter</text><text x="930" y="333">overload</text><text x="82" y="403" font-weight="700">GET timeout</text><text x="330" y="403">можно проверить</text><text x="640" y="403">остаток deadline</text><text x="930" y="403">неизвестный ответ</text><text x="82" y="473" font-weight="700">POST timeout</text><text x="330" y="473">key или status</text><text x="640" y="473">короткий limit</text><text x="930" y="473">дубль записи</text></g>
<rect x="54" y="560" width="1092" height="72" rx="16" fill="#7f1d1d"/><text x="600" y="605" text-anchor="middle" fill="#fecaca" font-weight="700">deadline и idempotency имеют приоритет над числом попыток</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,11 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля передачи вопроса о коррекции</title>
<desc id="desc">Схема показывает, как именованные вопросы о claim, condition, evidence и repro передаются в отдельный будущий авторизованный scope. Correction, recipient и outcome остаются не объявленными, поэтому схема не заявляет исправление или завершённый тест.</desc>
<title id="title">Петля incident runbook</title>
<desc id="desc">Петля инцидента проходит через симптом, scope, проверку гипотезы, одно обратимое действие и метрику восстановления.</desc>
<defs><marker id="a" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#86efac"/></marker><marker id="r" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto"><path d="M0 0L12 6L0 12z" fill="#fca5a5"/></marker></defs>
<rect width="1200" height="720" fill="#10231f"/>
<text x="62" y="78" fill="#f0fdf4" font-family="Arial, sans-serif" font-size="39" font-weight="700">Передача вопроса без фиктивного финала</text>
<text x="62" y="118" fill="#b9d9cb" font-family="Arial, sans-serif" font-size="22">P117 · corrective hand-off не назначает владельца и не публикует correction</text>
<g font-family="Arial, sans-serif"><rect x="82" y="220" width="246" height="126" rx="18" fill="#173e36" stroke="#86efac" stroke-width="2"/><text x="116" y="267" fill="#dcfce7" font-size="26" font-weight="700">Question envelope</text><text x="116" y="307" fill="#cbd5e1" font-size="19">claim · condition</text><rect x="480" y="220" width="246" height="126" rx="18" fill="#173e36" stroke="#86efac" stroke-width="2"/><text x="518" y="267" fill="#dcfce7" font-size="26" font-weight="700">Evidence boundary</text><text x="518" y="307" fill="#cbd5e1" font-size="19">immutable pin required</text><rect x="878" y="220" width="246" height="126" rx="18" fill="#173e36" stroke="#86efac" stroke-width="2"/><text x="928" y="267" fill="#dcfce7" font-size="26" font-weight="700">Repro question</text><text x="928" y="307" fill="#cbd5e1" font-size="19">not-run only</text></g>
<path d="M328 283 H462" stroke="#86efac" stroke-width="5"/><path d="M726 283 H860" stroke="#86efac" stroke-width="5"/><path d="M1124 346 C1124 500 836 570 610 570 C384 570 82 500 82 346" fill="none" stroke="#7dd3fc" stroke-width="5" stroke-dasharray="12 10"/>
<rect x="384" y="496" width="432" height="116" rx="18" fill="#16324a" stroke="#7dd3fc" stroke-width="2"/><text x="444" y="542" fill="#e0f2fe" font-family="Arial, sans-serif" font-size="27" font-weight="700">Separate future scope</text><text x="446" y="578" fill="#cbd5e1" font-family="Arial, sans-serif" font-size="19">authorization and method not created here</text>
<text x="78" y="676" fill="#fecaca" font-family="Arial, sans-serif" font-size="21" font-weight="700">Correction: not-declared · recipient: not-assigned · outcome: not-declared · productionEffect: not-attempted</text>
<text x="62" y="78" fill="#f0fdf4" font-family="Arial, sans-serif" font-size="39" font-weight="700">Инцидент: измерить → изменить → проверить</text>
<text x="62" y="118" fill="#b9d9cb" font-family="Arial, sans-serif" font-size="22">Один симптом, один рычаг, наблюдаемый критерий восстановления</text>
<g font-family="Arial, sans-serif" text-anchor="middle">
<circle cx="190" cy="300" r="105" fill="#173e36" stroke="#86efac" stroke-width="3"/><text x="190" y="288" fill="#dcfce7" font-size="26" font-weight="700">Симптом</text><text x="190" y="325" fill="#cbd5e1" font-size="19">5xx · p95 · scope</text>
<circle cx="480" cy="300" r="105" fill="#173e36" stroke="#86efac" stroke-width="3"/><text x="480" y="288" fill="#dcfce7" font-size="26" font-weight="700">Гипотеза</text><text x="480" y="325" fill="#cbd5e1" font-size="19">одна проверка</text>
<circle cx="770" cy="300" r="105" fill="#16324a" stroke="#7dd3fc" stroke-width="3"/><text x="770" y="288" fill="#e0f2fe" font-size="26" font-weight="700">Действие</text><text x="770" y="325" fill="#cbd5e1" font-size="19">обратимый шаг</text>
<circle cx="1060" cy="300" r="105" fill="#173e36" stroke="#86efac" stroke-width="3"/><text x="1060" y="288" fill="#dcfce7" font-size="26" font-weight="700">Проверка</text><text x="1060" y="325" fill="#cbd5e1" font-size="19">метрика + окно</text>
<path d="M295 300H375M585 300H665M875 300H955" stroke="#86efac" stroke-width="6" marker-end="url(#a)"/>
<path d="M1060 405C1060 550 480 590 190 405" fill="none" stroke="#7dd3fc" stroke-width="5" stroke-dasharray="12 10" marker-end="url(#a)"/>
<rect x="315" y="535" width="570" height="80" rx="16" fill="#7f1d1d" stroke="#fca5a5" stroke-width="3"/><text x="600" y="584" fill="#fee2e2" font-size="23" font-weight="700">Нет проверки → не закрывать инцидент</text>
<path d="M770 405V535" stroke="#fca5a5" stroke-width="5" marker-end="url(#r)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,7 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Договор о критическом пути</title><desc id="desc">Схема показывает четыре границы будущего вопроса и передачу плана без измеренного результата.</desc>
<rect width="1200" height="720" fill="#081525"/><text x="70" y="92" fill="#f4f8ff" font-family="Arial, sans-serif" font-size="42" font-weight="700">Договор о критическом пути</text><text x="70" y="132" fill="#a9bfd7" font-family="Arial, sans-serif" font-size="23">P112 · план/сценарий 2027-06 · source cutoff 2026-07-31</text>
<path d="M185 330H1015" stroke="#43617e" stroke-width="8" stroke-linecap="round"/><path d="M1015 330l-28-18v36z" fill="#43617e"/>
<g font-family="Arial, sans-serif"><g><circle cx="190" cy="330" r="75" fill="#123a5b" stroke="#69d3ff" stroke-width="3"/><text x="190" y="323" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">Навигация</text><text x="190" y="355" text-anchor="middle" fill="#b9d9ec" font-size="18">граница старта</text></g><g><circle cx="455" cy="330" r="75" fill="#173e55" stroke="#72e2c1" stroke-width="3"/><text x="455" y="323" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">Ресурсы</text><text x="455" y="355" text-anchor="middle" fill="#c0e6d8" font-size="18">видимые условия</text></g><g><circle cx="720" cy="330" r="75" fill="#3d3455" stroke="#c9a7ff" stroke-width="3"/><text x="720" y="323" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">Главный поток</text><text x="720" y="355" text-anchor="middle" fill="#ddd0fa" font-size="18">отдельный слой</text></g><g><circle cx="985" cy="330" r="75" fill="#214647" stroke="#9ce0a2" stroke-width="3"/><text x="985" y="323" text-anchor="middle" fill="#fff" font-size="25" font-weight="700">Действие</text><text x="985" y="355" text-anchor="middle" fill="#d0efd3" font-size="18">future question</text></g></g>
<rect x="150" y="510" width="900" height="115" rx="18" fill="#102438" stroke="#6de0ad" stroke-width="3"/><text x="600" y="557" text-anchor="middle" fill="#effff7" font-family="Arial, sans-serif" font-size="29" font-weight="700">synthetic-plan-hand-off</text><text x="600" y="594" text-anchor="middle" fill="#b9d9c9" font-family="Arial, sans-serif" font-size="22">productionEffect: not-attempted · без benchmark, telemetry и profile</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="480" viewBox="0 0 750 480" role="img" aria-labelledby="title desc">
<title id="title">Критический путь страницы</title>
<desc id="desc">Временная линия отделяет TTFB, HTML, блокирующие ресурсы и отрисовку.</desc>
<rect width="750" height="480" rx="24" fill="#f8fafc"/>
<text x="40" y="52" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Один экран — четыре участка</text>
<line x1="80" y1="245" x2="680" y2="245" stroke="#64748b" stroke-width="6"/>
<g font-family="Arial,sans-serif">
<circle cx="110" cy="245" r="18" fill="#0284c7"/><rect x="50" y="105" width="130" height="92" rx="14" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="115" y="140" text-anchor="middle" font-size="22" font-weight="700" fill="#075985">TTFB</text><text x="115" y="171" text-anchor="middle" font-size="18" fill="#0c4a6e">сервер</text>
<circle cx="280" cy="245" r="18" fill="#7c3aed"/><rect x="220" y="285" width="130" height="92" rx="14" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="285" y="320" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">HTML</text><text x="285" y="351" text-anchor="middle" font-size="18" fill="#4c1d95">передача</text>
<circle cx="450" cy="245" r="18" fill="#d97706"/><rect x="390" y="105" width="130" height="92" rx="14" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="455" y="140" text-anchor="middle" font-size="22" font-weight="700" fill="#92400e">CSS / JS</text><text x="455" y="171" text-anchor="middle" font-size="18" fill="#78350f">блокировка</text>
<circle cx="620" cy="245" r="18" fill="#16a34a"/><rect x="560" y="285" width="130" height="92" rx="14" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="625" y="320" text-anchor="middle" font-size="22" font-weight="700" fill="#166534">Paint</text><text x="625" y="351" text-anchor="middle" font-size="18" fill="#14532d">экран</text>
</g>
<text x="40" y="430" font-family="Arial,sans-serif" font-size="20" fill="#475569">Каждый участок требует собственного измерения.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,6 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица границ доказательств</title><desc id="desc">Матрица показывает четыре слоя будущего исследования и правило остановки при незаполненных условиях.</desc>
<rect width="1200" height="720" fill="#101022"/><text x="65" y="82" fill="#fbf7ff" font-family="Arial, sans-serif" font-size="40" font-weight="700">Сравнимость до evidence</text><text x="65" y="121" fill="#c2bddb" font-family="Arial, sans-serif" font-size="23">P112 · не результат, а матрица проверяемого будущего вопроса</text>
<g font-family="Arial, sans-serif" font-size="22"><rect x="65" y="175" width="1070" height="390" rx="12" fill="#1b1b38" stroke="#5f5d8c" stroke-width="2"/><path d="M65 255h1070M65 335h1070M65 415h1070M65 495h1070M340 175v390M660 175v390M900 175v390" stroke="#5f5d8c" stroke-width="2"/><text x="92" y="225" fill="#fff" font-weight="700">Слой</text><text x="370" y="225" fill="#fff" font-weight="700">Нужно назвать</text><text x="690" y="225" fill="#fff" font-weight="700">Опрокидывает claim</text><text x="930" y="225" fill="#fff" font-weight="700">Статус</text><text x="92" y="305" fill="#d8d6ff">Intent</text><text x="370" y="305" fill="#d8d6ff">доступное действие</text><text x="690" y="305" fill="#ffccb7">другое действие</text><text x="930" y="305" fill="#ffd879">not-collected</text><text x="92" y="385" fill="#d8d6ff">Boundary</text><text x="370" y="385" fill="#d8d6ff">старт и конец</text><text x="690" y="385" fill="#ffccb7">смена границы</text><text x="930" y="385" fill="#ffd879">not-collected</text><text x="92" y="465" fill="#d8d6ff">Conditions</text><text x="370" y="465" fill="#d8d6ff">browser · cache · route</text><text x="690" y="465" fill="#ffccb7">разные условия</text><text x="930" y="465" fill="#ffd879">not-collected</text><text x="92" y="545" fill="#d8d6ff">Evidence</text><text x="370" y="545" fill="#d8d6ff">разрешённый artefact</text><text x="690" y="545" fill="#ffccb7">нет provenance</text><text x="930" y="545" fill="#ffd879">not-attempted</text></g>
<rect x="250" y="615" width="700" height="62" rx="15" fill="#4b252e" stroke="#ff8494" stroke-width="2"/><text x="600" y="656" text-anchor="middle" fill="#ffe4e8" font-family="Arial, sans-serif" font-size="25" font-weight="700">Незаполненный слой → stop, не вывод о winner</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Матрица resource timing</title>
<desc id="desc">Для каждого ресурса сопоставлены инициатор, время, блокировка и потребитель.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Waterfall → зависимость</text>
<g font-family="Arial,sans-serif" font-size="19">
<rect x="38" y="82" width="674" height="58" rx="10" fill="#1e293b"/>
<text x="56" y="119" fill="#fff" font-weight="700">Ресурс</text><text x="190" y="119" fill="#fff" font-weight="700">Инициатор</text><text x="330" y="119" fill="#fff" font-weight="700">Время</text><text x="430" y="119" fill="#fff" font-weight="700">Ждёт</text><text x="565" y="119" fill="#fff" font-weight="700">Действие</text>
<rect x="38" y="150" width="674" height="78" rx="8" fill="#e0f2fe"/><text x="56" y="185" fill="#075985">style.css</text><text x="190" y="185" fill="#075985">parser</text><text x="330" y="185" fill="#075985">0–180ms</text><text x="430" y="185" fill="#075985">layout</text><text x="565" y="185" fill="#075985">разделить</text>
<rect x="38" y="238" width="674" height="78" rx="8" fill="#fef3c7"/><text x="56" y="273" fill="#92400e">app.js</text><text x="190" y="273" fill="#92400e">parser</text><text x="330" y="273" fill="#92400e">40–240ms</text><text x="430" y="273" fill="#92400e">DOM</text><text x="565" y="273" fill="#92400e">defer</text>
<rect x="38" y="326" width="674" height="78" rx="8" fill="#dcfce7"/><text x="56" y="361" fill="#14532d">analytics</text><text x="190" y="361" fill="#14532d">script</text><text x="330" y="361" fill="#14532d">250ms+</text><text x="430" y="361" fill="#14532d">ничего</text><text x="565" y="361" fill="#14532d">отложить</text>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Размер полосы не равен её влиянию на экран.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,6 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Цикл передачи evidence</title><desc id="desc">Схема показывает, как named плановый договор проходит проверки и передаётся новому владельцу без создания результата.</desc>
<rect width="1200" height="720" fill="#09201d"/><text x="65" y="84" fill="#effff9" font-family="Arial, sans-serif" font-size="40" font-weight="700">Evidence hand-off без подмены</text><text x="65" y="124" fill="#b6d8cf" font-family="Arial, sans-serif" font-size="23">P112 · будущий scope начинается только после отдельной авторизации</text>
<g font-family="Arial, sans-serif" font-size="24" text-anchor="middle"><rect x="80" y="280" width="205" height="115" rx="18" fill="#16433c" stroke="#68d4bb" stroke-width="3"/><text x="182" y="326" fill="#fff" font-weight="700">Named plan</text><text x="182" y="359" fill="#c2e9df">fixed literal</text><rect x="370" y="280" width="205" height="115" rx="18" fill="#25434a" stroke="#74c8e7" stroke-width="3"/><text x="472" y="326" fill="#fff" font-weight="700">Дата и cutoff</text><text x="472" y="359" fill="#d1e8ef">или stop</text><rect x="660" y="280" width="205" height="115" rx="18" fill="#3c3d4e" stroke="#beb3ff" stroke-width="3"/><text x="762" y="326" fill="#fff" font-weight="700">Conditions</text><text x="762" y="359" fill="#e2defc">not-collected</text><rect x="950" y="280" width="180" height="115" rx="18" fill="#1d5140" stroke="#85e6ad" stroke-width="3"/><text x="1040" y="326" fill="#fff" font-weight="700">Hand-off</text><text x="1040" y="359" fill="#d4f4dc">new owner</text></g>
<g stroke="#78b9aa" stroke-width="7" fill="#78b9aa"><path d="M285 337h70"/><path d="M355 337l-19-13v26z"/><path d="M575 337h70"/><path d="M645 337l-19-13v26z"/><path d="M865 337h70"/><path d="M935 337l-19-13v26z"/></g><path d="M762 395v100H520" stroke="#ff959e" stroke-width="6" fill="none"/><path d="M520 495l21-14v28z" fill="#ff959e"/><rect x="235" y="470" width="270" height="72" rx="14" fill="#572a34" stroke="#ff959e" stroke-width="2"/><text x="370" y="516" text-anchor="middle" fill="#ffe9ec" font-family="Arial, sans-serif" font-size="24" font-weight="700">stop: нет условий</text><text x="600" y="642" text-anchor="middle" fill="#c8e4da" font-family="Arial, sans-serif" font-size="25">Положительный итог: synthetic-plan-hand-off · productionEffect: not-attempted</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Повторяемый замер производительности</title>
<desc id="desc">Цикл фиксирует условия, собирает повторы, считает p95 и меняет один фактор.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Замер до и после</text>
<g font-family="Arial,sans-serif">
<rect x="55" y="105" width="145" height="90" rx="15" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="127" y="140" text-anchor="middle" font-size="22" font-weight="700" fill="#075985">Условия</text><text x="127" y="171" text-anchor="middle" font-size="18" fill="#0c4a6e">URL · cache</text>
<rect x="302" y="105" width="145" height="90" rx="15" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="374" y="140" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">Повторы</text><text x="374" y="171" text-anchor="middle" font-size="18" fill="#4c1d95">raw samples</text>
<rect x="550" y="105" width="145" height="90" rx="15" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="622" y="140" text-anchor="middle" font-size="22" font-weight="700" fill="#92400e">p95</text><text x="622" y="171" text-anchor="middle" font-size="18" fill="#78350f">median · хвост</text>
<rect x="302" y="315" width="145" height="90" rx="15" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="374" y="350" text-anchor="middle" font-size="22" font-weight="700" fill="#166534">Один фактор</text><text x="374" y="381" text-anchor="middle" font-size="18" fill="#14532d">сравнить</text>
<path d="M200 150h92" stroke="#475569" stroke-width="4"/><path d="m292 150-12-8v16z" fill="#475569"/><path d="M447 150h92" stroke="#475569" stroke-width="4"/><path d="m539 150-12-8v16z" fill="#475569"/><path d="M622 197v100" stroke="#475569" stroke-width="4"/><path d="m622 297-8-12h16z" fill="#475569"/><path d="M302 360h-115V238" fill="none" stroke="#475569" stroke-width="4"/><path d="m187 238-8 12h16z" fill="#475569"/>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Сырое распределение важнее одной удачной цифры.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,28 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Контракт отказного сценария</title>
<desc id="desc">Схема синтетического вопроса об отказе зависимости. От верхней карточки отходят действие, граница, retry и evidence; невыбранные retry, replica и recovery отмечены красными стоп-границами.</desc>
<rect width="1200" height="720" fill="#f8fafc"/>
<rect x="330" y="44" width="540" height="104" rx="18" fill="#17324d"/>
<text x="600" y="88" fill="#fff" font-family="Arial, sans-serif" font-size="29" text-anchor="middle">Синтетический отказный сценарий</text>
<text x="600" y="121" fill="#c7e5ff" font-family="Arial, sans-serif" font-size="20" text-anchor="middle">только вопрос, не диагноз</text>
<path d="M600 148V210M180 210H1020" stroke="#56738d" stroke-width="4" fill="none"/>
<path d="M180 210V260M460 210V260M740 210V260M1020 210V260" stroke="#56738d" stroke-width="4"/>
<g font-family="Arial, sans-serif" text-anchor="middle">
<rect x="55" y="260" width="250" height="130" rx="15" fill="#e6f3ff" stroke="#2f78b7" stroke-width="3"/>
<text x="180" y="305" fill="#17324d" font-size="24">Действие</text><text x="180" y="340" fill="#17324d" font-size="18">именованное,</text><text x="180" y="367" fill="#17324d" font-size="18">без payload</text>
<rect x="335" y="260" width="250" height="130" rx="15" fill="#eaf7ee" stroke="#347a50" stroke-width="3"/>
<text x="460" y="305" fill="#163d28" font-size="24">Граница</text><text x="460" y="340" fill="#163d28" font-size="18">evidence:</text><text x="460" y="367" fill="#163d28" font-size="18">not-collected</text>
<rect x="615" y="260" width="250" height="130" rx="15" fill="#fff3db" stroke="#a86912" stroke-width="3"/>
<text x="740" y="305" fill="#6b4208" font-size="24">Retry</text><text x="740" y="340" fill="#6b4208" font-size="18">явно не выбран,</text><text x="740" y="367" fill="#6b4208" font-size="18">не default</text>
<rect x="895" y="260" width="250" height="130" rx="15" fill="#f0ebff" stroke="#7052a4" stroke-width="3"/>
<text x="1020" y="305" fill="#422b71" font-size="24">Результат</text><text x="1020" y="340" fill="#422b71" font-size="18">synthetic plan</text><text x="1020" y="367" fill="#422b71" font-size="18">hand-off</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Дерево решения retry</title>
<desc id="desc">Решение о повторе учитывает deadline, метод и статус ответа.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Retry начинается с контракта</text>
<g font-family="Arial,sans-serif">
<rect x="275" y="82" width="200" height="70" rx="14" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="375" y="125" text-anchor="middle" font-size="23" font-weight="700" fill="#075985">Ответ запроса</text>
<path d="M375 152v42" stroke="#475569" stroke-width="4"/><path d="m375 194-8-12h16z" fill="#475569"/>
<rect x="260" y="205" width="230" height="70" rx="14" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="375" y="248" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">Deadline остался?</text>
<path d="M260 240H145v70" fill="none" stroke="#dc2626" stroke-width="4"/><path d="m145 310-8-12h16z" fill="#dc2626"/><text x="190" y="230" font-size="18" fill="#991b1b">нет</text>
<rect x="55" y="325" width="180" height="66" rx="13" fill="#fee2e2" stroke="#dc2626" stroke-width="3"/><text x="145" y="365" text-anchor="middle" font-size="21" font-weight="700" fill="#991b1b">вернуть timeout</text>
<path d="M490 240h115v70" fill="none" stroke="#16a34a" stroke-width="4"/><path d="m605 310-8-12h16z" fill="#16a34a"/><text x="535" y="230" font-size="18" fill="#166534">да</text>
<rect x="515" y="325" width="180" height="66" rx="13" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="605" y="352" text-anchor="middle" font-size="20" font-weight="700" fill="#166534">метод безопасен?</text><text x="605" y="378" text-anchor="middle" font-size="18" fill="#14532d">retry / return</text>
</g>
<path d="M740 390V475M460 430H1020" stroke="#b42318" stroke-width="4" fill="none"/>
<g font-family="Arial, sans-serif" text-anchor="middle">
<rect x="330" y="475" width="260" height="118" rx="14" fill="#fff0ef" stroke="#b42318" stroke-width="3"/>
<text x="460" y="518" fill="#8c1d18" font-size="23">СТОП</text><text x="460" y="550" fill="#8c1d18" font-size="17">implicit retry</text><text x="460" y="575" fill="#8c1d18" font-size="17">и hidden evidence</text>
<rect x="680" y="475" width="340" height="118" rx="14" fill="#fff0ef" stroke="#b42318" stroke-width="3"/>
<text x="850" y="518" fill="#8c1d18" font-size="23">СТОП</text><text x="850" y="550" fill="#8c1d18" font-size="17">implicit replica</text><text x="850" y="575" fill="#8c1d18" font-size="17">или recovery</text>
</g>
<text x="600" y="665" fill="#41576b" font-family="Arial, sans-serif" font-size="20" text-anchor="middle">P113 · план на 2027-07 · production effect не предпринимается</text>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Число попыток не заменяет семантику операции.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,22 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Матрица evidence для fault tree</title>
<desc id="desc">Матрица показывает пять ветвей fault tree и их синтетические статусы. Отдельная красная полоса запрещает выводить нагрузку, восстановление или уровень сервиса из отсутствующих данных.</desc>
<rect width="1200" height="720" fill="#f8fafc"/>
<text x="600" y="58" font-family="Arial, sans-serif" font-size="31" fill="#17324d" text-anchor="middle">Fault tree: вопросы и пределы evidence</text>
<g font-family="Arial, sans-serif" font-size="21">
<rect x="70" y="100" width="360" height="72" fill="#17324d"/><rect x="430" y="100" width="330" height="72" fill="#17324d"/><rect x="760" y="100" width="370" height="72" fill="#17324d"/>
<text x="250" y="144" fill="#fff" text-anchor="middle">Ветка</text><text x="595" y="144" fill="#fff" text-anchor="middle">Статус P113</text><text x="945" y="144" fill="#fff" text-anchor="middle">Вывод, который остановлен</text>
<g fill="#fff" stroke="#90a4b8" stroke-width="2">
<rect x="70" y="172" width="360" height="74"/><rect x="430" y="172" width="330" height="74"/><rect x="760" y="172" width="370" height="74"/>
<rect x="70" y="246" width="360" height="74"/><rect x="430" y="246" width="330" height="74"/><rect x="760" y="246" width="370" height="74"/>
<rect x="70" y="320" width="360" height="74"/><rect x="430" y="320" width="330" height="74"/><rect x="760" y="320" width="370" height="74"/>
<rect x="70" y="394" width="360" height="74"/><rect x="430" y="394" width="330" height="74"/><rect x="760" y="394" width="370" height="74"/>
<rect x="70" y="468" width="360" height="74"/><rect x="430" y="468" width="330" height="74"/><rect x="760" y="468" width="370" height="74"/>
</g>
<g fill="#17324d"><text x="94" y="217">Форма действия</text><text x="94" y="291">Нагрузка</text><text x="94" y="365">Восстановление</text><text x="94" y="439">Критерий сервиса</text><text x="94" y="513">Наблюдение</text></g>
<g text-anchor="middle"><text x="595" y="217" fill="#347a50">named synthetic</text><text x="595" y="291" fill="#a86912">not-collected</text><text x="595" y="365" fill="#a86912">not-selected</text><text x="595" y="439" fill="#a86912">not-defined</text><text x="595" y="513" fill="#a86912">not-collected</text></g>
<g fill="#8c1d18"><text x="780" y="217">реальный side effect</text><text x="780" y="291">выдержала / не выдержала</text><text x="780" y="365">есть recovery path</text><text x="780" y="439">соблюдён SLO</text><text x="780" y="513">известна причина</text></g>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Границы надёжности запроса</title>
<desc id="desc">Транспорт, HTTP и операция отвечают на разные вопросы при повторе.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Один timeout — три вопроса</text>
<g font-family="Arial,sans-serif">
<rect x="45" y="95" width="200" height="115" rx="16" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="145" y="135" text-anchor="middle" font-size="23" font-weight="700" fill="#075985">Транспорт</text><text x="145" y="169" text-anchor="middle" font-size="19" fill="#0c4a6e">доставлены байты?</text><text x="145" y="195" text-anchor="middle" font-size="18" fill="#0c4a6e">соединение</text>
<path d="M255 152h45" stroke="#475569" stroke-width="4"/><path d="m300 152-12-8v16z" fill="#475569"/>
<rect x="325" y="95" width="200" height="115" rx="16" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="425" y="135" text-anchor="middle" font-size="23" font-weight="700" fill="#5b21b6">HTTP</text><text x="425" y="169" text-anchor="middle" font-size="19" fill="#4c1d95">какой статус?</text><text x="425" y="195" text-anchor="middle" font-size="18" fill="#4c1d95">метод · ответ</text>
<path d="M535 152h45" stroke="#475569" stroke-width="4"/><path d="m580 152-12-8v16z" fill="#475569"/>
<rect x="605" y="95" width="100" height="115" rx="16" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="655" y="135" text-anchor="middle" font-size="21" font-weight="700" fill="#92400e">Операция</text><text x="655" y="169" text-anchor="middle" font-size="18" fill="#78350f">эффект?</text><text x="655" y="195" text-anchor="middle" font-size="18" fill="#78350f">key</text>
<rect x="45" y="285" width="660" height="110" rx="16" fill="#fff" stroke="#cbd5e1" stroke-width="2"/><text x="70" y="325" font-family="Arial,sans-serif" font-size="22" font-weight="700" fill="#172033">Проверка после timeout</text><text x="70" y="357" font-family="Arial,sans-serif" font-size="19" fill="#334155">GET: повтор с лимитом · POST: узнать состояние по ключу</text><text x="70" y="384" font-family="Arial,sans-serif" font-size="19" fill="#334155">Транспорт не подтверждает бизнес-результат.</text>
</g>
<rect x="120" y="590" width="960" height="76" rx="15" fill="#fff0ef" stroke="#b42318" stroke-width="3"/>
<text x="600" y="638" font-family="Arial, sans-serif" font-size="24" fill="#8c1d18" text-anchor="middle">Нет evidence — нет вывода о нагрузке, recovery или уровне сервиса</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,23 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="720" viewBox="0 0 1200 720" role="img" aria-labelledby="title desc">
<title id="title">Петля передачи синтетического вопроса</title>
<desc id="desc">Диаграмма показывает редакционную передачу будущего вопроса: временная граница, синтетический сценарий и явные пустые states проходят три проверки. Скрытые evidence, retry и заявленный результат останавливаются. Единственный выход — synthetic plan hand-off.</desc>
<defs><marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"><path d="M0,0 L0,6 L9,3 z" fill="#56738d"/></marker></defs>
<rect width="1200" height="720" fill="#f8fafc"/>
<text x="600" y="58" font-family="Arial, sans-serif" font-size="31" fill="#17324d" text-anchor="middle">Передача без легенды об операции</text>
<g font-family="Arial, sans-serif" text-anchor="middle">
<rect x="60" y="270" width="230" height="130" rx="16" fill="#e6f3ff" stroke="#2f78b7" stroke-width="3"/>
<text x="175" y="315" font-size="23" fill="#17324d">Вход</text><text x="175" y="348" font-size="17" fill="#17324d">дата, cutoff,</text><text x="175" y="374" font-size="17" fill="#17324d">synthetic scenario</text>
<rect x="385" y="130" width="210" height="100" rx="16" fill="#fff3db" stroke="#a86912" stroke-width="3"/>
<text x="490" y="171" font-size="21" fill="#6b4208">Проверка 1</text><text x="490" y="204" font-size="16" fill="#6b4208">временная граница</text>
<rect x="385" y="310" width="210" height="100" rx="16" fill="#fff3db" stroke="#a86912" stroke-width="3"/>
<text x="490" y="351" font-size="21" fill="#6b4208">Проверка 2</text><text x="490" y="384" font-size="16" fill="#6b4208">evidence и config</text>
<rect x="385" y="490" width="210" height="100" rx="16" fill="#fff3db" stroke="#a86912" stroke-width="3"/>
<text x="490" y="531" font-size="21" fill="#6b4208">Проверка 3</text><text x="490" y="564" font-size="16" fill="#6b4208">retry, replica, recovery</text>
<rect x="815" y="270" width="300" height="130" rx="16" fill="#eaf7ee" stroke="#347a50" stroke-width="3"/>
<text x="965" y="315" font-size="23" fill="#163d28">Единственный выход</text><text x="965" y="348" font-size="17" fill="#163d28">synthetic-plan-hand-off</text><text x="965" y="374" font-size="17" fill="#163d28">not-attempted</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Событие попытки retry</title>
<desc id="desc">Каждая попытка сохраняет номер, статус, остаток времени и решение.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Attempt → decision</text>
<g font-family="Arial,sans-serif">
<rect x="45" y="105" width="150" height="95" rx="15" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="120" y="143" text-anchor="middle" font-size="22" font-weight="700" fill="#075985">Attempt 1</text><text x="120" y="176" text-anchor="middle" font-size="19" fill="#0c4a6e">timeout</text>
<path d="M205 152h55" stroke="#475569" stroke-width="4"/><path d="m260 152-12-8v16z" fill="#475569"/>
<rect x="280" y="105" width="150" height="95" rx="15" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="355" y="143" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">Attempt 2</text><text x="355" y="176" text-anchor="middle" font-size="19" fill="#4c1d95">503</text>
<path d="M440 152h55" stroke="#475569" stroke-width="4"/><path d="m495 152-12-8v16z" fill="#475569"/>
<rect x="515" y="105" width="190" height="95" rx="15" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="610" y="143" text-anchor="middle" font-size="22" font-weight="700" fill="#166534">Decision</text><text x="610" y="176" text-anchor="middle" font-size="19" fill="#14532d">retry или return</text>
<rect x="120" y="300" width="510" height="92" rx="15" fill="#fff" stroke="#cbd5e1" stroke-width="2"/><text x="375" y="337" text-anchor="middle" font-size="22" font-weight="700" fill="#172033">В событии</text><text x="375" y="370" text-anchor="middle" font-size="19" fill="#334155">operationId · attempt · status · remainingMs</text>
</g>
<path d="M290 320H350V180H385M290 335H385M290 350H350V540H385M595 180H690V335H815M595 360H815M595 540H690V335" stroke="#56738d" stroke-width="4" fill="none" marker-end="url(#arrow)"/>
<path d="M490 230V278M490 410V458M490 590V630H720" stroke="#b42318" stroke-width="4" fill="none" marker-end="url(#arrow)"/>
<rect x="720" y="596" width="355" height="68" rx="14" fill="#fff0ef" stroke="#b42318" stroke-width="3"/>
<text x="897" y="624" font-family="Arial, sans-serif" font-size="18" fill="#8c1d18" text-anchor="middle">СТОП: hidden evidence, implicit policy,</text><text x="897" y="649" font-family="Arial, sans-serif" font-size="18" fill="#8c1d18" text-anchor="middle">claimed operational result</text>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Причина и действие — разные поля.</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,11 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="290" viewBox="0 0 375 290" role="img" aria-labelledby="title desc">
<title id="title">Договор о синтетическом активе и границе</title><desc id="desc">Три карточки неопределённости ведут к передаче плана. Заявленный путь, контроль или эффект останавливаются.</desc>
<rect width="375" height="290" fill="#f5f7fb"/><style>text{font-family:Arial,sans-serif;fill:#172554}.h{font-size:16px;font-weight:700}.t{font-size:13px;font-weight:700}.s{font-size:11px}.card{fill:#fff;stroke:#64748b;stroke-width:1.5}.go{fill:#e0f2fe;stroke:#0369a1;stroke-width:1.5}.stop{fill:#fff1f2;stroke:#be123c;stroke-width:1.5}.a{stroke:#475569;stroke-width:1.5;fill:none}</style>
<text x="18" y="25" class="h">P114: договор о границе</text>
<rect x="16" y="50" width="104" height="75" rx="10" class="card"/><text x="27" y="75" class="t">Актив</text><text x="27" y="98" class="s">synthetic label</text><text x="27" y="114" class="s">not-declared</text>
<rect x="136" y="50" width="104" height="75" rx="10" class="card"/><text x="147" y="75" class="t">Граница</text><text x="147" y="101" class="s">not-mapped</text><text x="147" y="116" class="s">not-accepted</text>
<rect x="256" y="50" width="104" height="75" rx="10" class="card"/><text x="267" y="75" class="t">Путь</text><text x="267" y="101" class="s">not-mapped</text><text x="267" y="116" class="s">не карта системы</text>
<path d="M120 87H136M240 87H256M188 125V150" class="a"/><path d="M184 144l4 7 4-7" class="a"/>
<rect x="85" y="151" width="205" height="55" rx="11" class="go"/><text x="108" y="176" class="t">synthetic-plan-hand-off</text><text x="108" y="194" class="s">effect: not-attempted</text>
<rect x="18" y="232" width="105" height="35" rx="8" class="stop"/><text x="29" y="254" class="s">path claim → stop</text><rect x="135" y="232" width="105" height="35" rx="8" class="stop"/><text x="145" y="254" class="s">control claim → stop</text><rect x="252" y="232" width="105" height="35" rx="8" class="stop"/><text x="262" y="254" class="s">effect claim → stop</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Проверка URL до сети</title>
<desc id="desc">URL проходит parse, схему, hostname, порт и egress-контроль до вызова клиента.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">URL не должен сразу стать fetch</text>
<g font-family="Arial,sans-serif">
<rect x="38" y="120" width="120" height="120" rx="16" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="98" y="168" text-anchor="middle" font-size="22" font-weight="700" fill="#075985">parse</text><text x="98" y="202" text-anchor="middle" font-size="18" fill="#0c4a6e">URL</text>
<path d="M170 180h30" stroke="#475569" stroke-width="4"/><path d="m200 180-12-8v16z" fill="#475569"/>
<rect x="212" y="120" width="120" height="120" rx="16" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="272" y="168" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">scheme</text><text x="272" y="202" text-anchor="middle" font-size="18" fill="#4c1d95">https</text>
<path d="M344 180h30" stroke="#475569" stroke-width="4"/><path d="m374 180-12-8v16z" fill="#475569"/>
<rect x="386" y="120" width="120" height="120" rx="16" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="446" y="168" text-anchor="middle" font-size="22" font-weight="700" fill="#92400e">host</text><text x="446" y="202" text-anchor="middle" font-size="18" fill="#78350f">allowlist</text>
<path d="M518 180h30" stroke="#475569" stroke-width="4"/><path d="m548 180-12-8v16z" fill="#475569"/>
<rect x="560" y="120" width="150" height="120" rx="16" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="635" y="168" text-anchor="middle" font-size="22" font-weight="700" fill="#166534">egress</text><text x="635" y="202" text-anchor="middle" font-size="18" fill="#14532d">fetch</text>
<rect x="100" y="320" width="550" height="78" rx="15" fill="#fee2e2" stroke="#dc2626" stroke-width="3"/><text x="375" y="368" text-anchor="middle" font-size="22" font-weight="700" fill="#991b1b">redirect и новый host → повторить проверки</text>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Credentials и неожиданный порт останавливают путь.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,11 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="300" viewBox="0 0 375 300" role="img" aria-labelledby="title desc">
<title id="title">Матрица пути, покрытия и свидетельства</title><desc id="desc">Неотображённый путь, невыбранный контроль и несобранное свидетельство не дают положительного результата. Разрешена только передача плана.</desc>
<rect width="375" height="300" fill="#f5f7fb"/><style>text{font-family:Arial,sans-serif;fill:#172554}.h{font-size:16px;font-weight:700}.t{font-size:12px;font-weight:700}.s{font-size:11px}.head{fill:#dbeafe;stroke:#1d4ed8;stroke-width:1}.cell{fill:#fff;stroke:#94a3b8;stroke-width:1}.bad{fill:#fff1f2;stroke:#be123c;stroke-width:1}.ok{fill:#e0f2fe;stroke:#0369a1;stroke-width:1.5}</style>
<text x="18" y="25" class="h">P114: матрица без мнимого покрытия</text>
<rect x="18" y="46" width="98" height="33" class="head"/><rect x="116" y="46" width="104" height="33" class="head"/><rect x="220" y="46" width="137" height="33" class="head"/><text x="28" y="67" class="t">Слой</text><text x="126" y="67" class="t">Статус</text><text x="230" y="67" class="t">Вывод</text>
<rect x="18" y="79" width="98" height="38" class="cell"/><rect x="116" y="79" width="104" height="38" class="cell"/><rect x="220" y="79" width="137" height="38" class="bad"/><text x="28" y="103" class="s">Synthetic path</text><text x="126" y="103" class="s">not-mapped</text><text x="230" y="103" class="s">claim → stop</text>
<rect x="18" y="117" width="98" height="38" class="cell"/><rect x="116" y="117" width="104" height="38" class="cell"/><rect x="220" y="117" width="137" height="38" class="bad"/><text x="28" y="141" class="s">Coverage</text><text x="126" y="141" class="s">not-selected</text><text x="230" y="141" class="s">claim → stop</text>
<rect x="18" y="155" width="98" height="38" class="cell"/><rect x="116" y="155" width="104" height="38" class="cell"/><rect x="220" y="155" width="137" height="38" class="bad"/><text x="28" y="179" class="s">Evidence</text><text x="126" y="179" class="s">not-collected</text><text x="230" y="179" class="s">claim → stop</text>
<rect x="18" y="193" width="98" height="38" class="cell"/><rect x="116" y="193" width="104" height="38" class="cell"/><rect x="220" y="193" width="137" height="38" class="bad"/><text x="28" y="217" class="s">Effect</text><text x="126" y="217" class="s">not-attempted</text><text x="230" y="217" class="s">claim → stop</text>
<rect x="63" y="252" width="249" height="32" rx="8" class="ok"/><text x="84" y="273" class="t">Выход: synthetic-plan-hand-off</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Матрица авторизации</title>
<desc id="desc">Субъект, роль, действие и объект сходятся в решении allow или deny.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Решение доступа строится из полей</text>
<g font-family="Arial,sans-serif">
<rect x="42" y="105" width="150" height="85" rx="14" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="117" y="141" text-anchor="middle" font-size="22" font-weight="700" fill="#075985">Субъект</text><text x="117" y="171" text-anchor="middle" font-size="18" fill="#0c4a6e">subjectId</text>
<rect x="212" y="105" width="150" height="85" rx="14" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="287" y="141" text-anchor="middle" font-size="22" font-weight="700" fill="#5b21b6">Роль</text><text x="287" y="171" text-anchor="middle" font-size="18" fill="#4c1d95">claims</text>
<rect x="382" y="105" width="150" height="85" rx="14" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="457" y="141" text-anchor="middle" font-size="22" font-weight="700" fill="#92400e">Действие</text><text x="457" y="171" text-anchor="middle" font-size="18" fill="#78350f">read / write</text>
<rect x="552" y="105" width="150" height="85" rx="14" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="627" y="141" text-anchor="middle" font-size="22" font-weight="700" fill="#166534">Объект</text><text x="627" y="171" text-anchor="middle" font-size="18" fill="#14532d">ownerId</text>
<path d="M117 190v75h258" fill="none" stroke="#475569" stroke-width="4"/><path d="M287 190v75h88" fill="none" stroke="#475569" stroke-width="4"/><path d="M457 190v75h-82" fill="none" stroke="#475569" stroke-width="4"/><path d="M627 190v75H375" fill="none" stroke="#475569" stroke-width="4"/>
<path d="M375 265v38" stroke="#475569" stroke-width="4"/><path d="m375 303-8-12h16z" fill="#475569"/>
<rect x="235" y="325" width="280" height="74" rx="15" fill="#1e293b"/><text x="375" y="371" text-anchor="middle" font-size="24" font-weight="700" fill="#fff">ALLOW / DENY</text>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Неизвестное значение ведёт в deny-by-default.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,12 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="375" height="290" viewBox="0 0 375 290" role="img" aria-labelledby="title desc">
<title id="title">Петля редакционной передачи evidence</title><desc id="desc">Синтетическая карточка проходит проверку времени, отсутствия claims и отсутствия назначения. При ошибке она останавливается; иначе передаётся плановый вопрос.</desc>
<rect width="375" height="290" fill="#f5f7fb"/><style>text{font-family:Arial,sans-serif;fill:#172554}.h{font-size:16px;font-weight:700}.t{font-size:13px;font-weight:700}.s{font-size:11px}.node{fill:#fff;stroke:#475569;stroke-width:1.5}.ok{fill:#e0f2fe;stroke:#0369a1;stroke-width:1.5}.stop{fill:#fff1f2;stroke:#be123c;stroke-width:1.5}.a{stroke:#475569;stroke-width:1.5;fill:none}.r{stroke:#be123c;stroke-width:1.5;fill:none}</style>
<text x="18" y="25" class="h">P114: передача без narrative</text>
<rect x="18" y="112" width="84" height="62" rx="9" class="node"/><text x="29" y="139" class="t">Literal</text><text x="29" y="158" class="s">fixed statuses</text>
<rect x="140" y="48" width="112" height="48" rx="9" class="node"/><text x="151" y="71" class="t">1. Время</text><text x="151" y="87" class="s">даты совпадают</text>
<rect x="140" y="121" width="112" height="48" rx="9" class="node"/><text x="151" y="144" class="t">2. Claims</text><text x="151" y="160" class="s">статусы пусты</text>
<rect x="140" y="194" width="112" height="48" rx="9" class="node"/><text x="151" y="217" class="t">3. Назначение</text><text x="151" y="233" class="s">owner не задан</text>
<path d="M102 143H122V72H140M102 143H140M102 143H122V218H140M252 72H275M252 145H275M252 218H275" class="a"/>
<rect x="275" y="112" width="84" height="62" rx="9" class="ok"/><text x="283" y="136" class="t">Hand-off</text><text x="283" y="154" class="s">not-assigned</text><text x="283" y="168" class="s">not-attempted</text>
<path d="M196 242V263H80" class="r"/><rect x="18" y="248" width="100" height="30" rx="7" class="stop"/><text x="28" y="268" class="s">любой claim → stop</text>
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="500" viewBox="0 0 750 500" role="img" aria-labelledby="title desc">
<title id="title">Проверяемая security-строка</title>
<desc id="desc">Требование связывается с положительным и отрицательным тестом, результатом и исправлением.</desc>
<rect width="750" height="500" rx="24" fill="#f8fafc"/>
<text x="38" y="50" font-family="Arial,sans-serif" font-size="26" font-weight="700" fill="#172033">Требование → тест → результат</text>
<g font-family="Arial,sans-serif">
<rect x="35" y="125" width="125" height="85" rx="14" fill="#e0f2fe" stroke="#0284c7" stroke-width="3"/><text x="97" y="161" text-anchor="middle" font-size="20" font-weight="700" fill="#075985">Требование</text><text x="97" y="191" text-anchor="middle" font-size="17" fill="#0c4a6e">AUTH-01</text>
<path d="M170 168h38" stroke="#475569" stroke-width="4"/><path d="m208 168-12-8v16z" fill="#475569"/>
<rect x="220" y="125" width="125" height="85" rx="14" fill="#ede9fe" stroke="#7c3aed" stroke-width="3"/><text x="282" y="161" text-anchor="middle" font-size="20" font-weight="700" fill="#5b21b6">Input</text><text x="282" y="191" text-anchor="middle" font-size="17" fill="#4c1d95">owner / other</text>
<path d="M355 168h38" stroke="#475569" stroke-width="4"/><path d="m393 168-12-8v16z" fill="#475569"/>
<rect x="405" y="125" width="125" height="85" rx="14" fill="#fef3c7" stroke="#d97706" stroke-width="3"/><text x="467" y="161" text-anchor="middle" font-size="20" font-weight="700" fill="#92400e">Assert</text><text x="467" y="191" text-anchor="middle" font-size="17" fill="#78350f">allow / deny</text>
<path d="M540 168h38" stroke="#475569" stroke-width="4"/><path d="m578 168-12-8v16z" fill="#475569"/>
<rect x="590" y="125" width="125" height="85" rx="14" fill="#dcfce7" stroke="#16a34a" stroke-width="3"/><text x="652" y="161" text-anchor="middle" font-size="20" font-weight="700" fill="#166534">Result</text><text x="652" y="191" text-anchor="middle" font-size="17" fill="#14532d">evidence</text>
<path d="M652 220v100H270V250" fill="none" stroke="#dc2626" stroke-width="4"/><path d="m270 250-8 12h16z" fill="#dc2626"/>
<rect x="205" y="335" width="330" height="64" rx="14" fill="#fee2e2" stroke="#dc2626" stroke-width="3"/><text x="370" y="375" text-anchor="middle" font-size="21" font-weight="700" fill="#991b1b">Расхождение → исправить</text>
</g>
<text x="38" y="455" font-family="Arial,sans-serif" font-size="20" fill="#475569">Отрицательный вход обязателен для границы.</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB