See [docs/prs/2026-10-17-PR#117-doccheck-variant-b.md](docs/prs/2026-10-17-PR%23117-doccheck-variant-b.md). Replaces the economy-model summary of the doc check with one Jev call per changed file, and adds a data-outflow check. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #117 Co-authored-by: claude-code <claude-code@javagil.de>
165 lines
10 KiB
XML
165 lines
10 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 900" width="1600" height="900" role="img"
|
|
aria-label="werkrevisor: how a pull request gets merged">
|
|
<title>werkrevisor: how a pull request gets merged</title>
|
|
<defs>
|
|
<style>
|
|
text { font-family: Inter, "IBM Plex Sans", "Segoe UI", Helvetica, Arial, sans-serif; fill: #141616; }
|
|
.title { font-size: 40px; font-weight: 700; letter-spacing: -0.5px; }
|
|
.subtitle { font-size: 21px; fill: #4a5553; }
|
|
.lane { fill: #f3f6f5; }
|
|
.lane-label { font-size: 21px; font-weight: 700; }
|
|
.lane-sub { font-size: 15px; fill: #5d6967; }
|
|
.box { fill: #ffffff; stroke: #c9d3d1; stroke-width: 1.5; }
|
|
.box-main { fill: #e7f1f3; stroke: #0e6b7d; stroke-width: 2; }
|
|
.box-title { font-size: 20px; font-weight: 600; }
|
|
.box-text { font-size: 16px; fill: #3e4645; }
|
|
.item { font-size: 17px; fill: #24302e; }
|
|
.arrow { fill: none; stroke: #6e7c7a; stroke-width: 2.5; }
|
|
.loop { fill: none; stroke: #0e6b7d; stroke-width: 3; stroke-dasharray: 9 6; }
|
|
.label { font-size: 15px; fill: #4a5553; }
|
|
.label-strong { font-size: 15px; font-weight: 600; }
|
|
.pill-text { font-size: 15px; font-weight: 700; fill: #ffffff; letter-spacing: 0.5px; }
|
|
.pill-note { font-weight: 500; letter-spacing: 0; }
|
|
.pill-dark, .pill-dark tspan { fill: #141616; }
|
|
.stat-number { font-size: 30px; font-weight: 700; fill: #0e6b7d; }
|
|
.stat-text { font-size: 15.5px; fill: #3e4645; }
|
|
.footer { font-size: 14px; fill: #7a8785; }
|
|
</style>
|
|
<marker id="head" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#6e7c7a"/>
|
|
</marker>
|
|
<marker id="head-teal" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#0e6b7d"/>
|
|
</marker>
|
|
<marker id="head-green" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#24733e"/>
|
|
</marker>
|
|
<marker id="head-yellow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#d4a514"/>
|
|
</marker>
|
|
<marker id="head-orange" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#e07b2e"/>
|
|
</marker>
|
|
<marker id="head-red" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M0,0 L10,5 L0,10 z" fill="#c0392b"/>
|
|
</marker>
|
|
</defs>
|
|
|
|
<rect width="1600" height="900" fill="#ffffff"/>
|
|
|
|
<!-- Title -->
|
|
<text class="title" x="40" y="60">How a pull request gets merged with werkrevisor</text>
|
|
<text class="subtitle" x="40" y="94">Rules and Jev decide, a model reviews the code, and a human looks only where it matters.</text>
|
|
|
|
<!-- Lanes -->
|
|
<rect class="lane" x="30" y="122" width="1540" height="166" rx="16"/>
|
|
<rect class="lane" x="30" y="300" width="1540" height="262" rx="16"/>
|
|
<rect class="lane" x="30" y="574" width="1540" height="124" rx="16"/>
|
|
<rect class="lane" x="30" y="710" width="1540" height="86" rx="16"/>
|
|
|
|
<text class="lane-label" x="52" y="196">Author</text>
|
|
<text class="lane-sub" x="52" y="220">developer or</text>
|
|
<text class="lane-sub" x="52" y="240">coding agent</text>
|
|
<text class="lane-label" x="52" y="420">werkrevisor</text>
|
|
<text class="lane-sub" x="52" y="444">in Werkator,</text>
|
|
<text class="lane-sub" x="52" y="464">for each head</text>
|
|
<text class="lane-label" x="52" y="632">Human</text>
|
|
<text class="lane-sub" x="52" y="656">reviewer</text>
|
|
<text class="lane-label" x="52" y="760">Gitea</text>
|
|
|
|
<!-- Author lane -->
|
|
<rect class="box" x="236" y="160" width="200" height="92" rx="12"/>
|
|
<text class="box-title" x="256" y="198">Branch with</text>
|
|
<text class="box-title" x="256" y="224">PR document</text>
|
|
|
|
<rect class="box" x="472" y="160" width="190" height="92" rx="12"/>
|
|
<text class="box-title" x="492" y="198">Pull request</text>
|
|
<text class="box-text" x="492" y="224">titled "WIP: …"</text>
|
|
|
|
<rect class="box" x="698" y="160" width="200" height="92" rx="12"/>
|
|
<text class="box-title" x="718" y="198">Ready:</text>
|
|
<text class="box-text" x="718" y="224">remove "WIP: "</text>
|
|
|
|
<rect class="box" x="1250" y="146" width="300" height="120" rx="12"/>
|
|
<text class="box-title" x="1270" y="180">Rework</text>
|
|
<text class="box-text" x="1270" y="206">commit a fix, lower the risk,</text>
|
|
<text class="box-text" x="1270" y="228">revert what the task does not need,</text>
|
|
<text class="box-text" x="1270" y="250">or answer each hint and resolve it</text>
|
|
|
|
<path class="arrow" d="M436,206 H468" marker-end="url(#head)"/>
|
|
<path class="arrow" d="M662,206 H694" marker-end="url(#head)"/>
|
|
|
|
<!-- werkrevisor lane: the review -->
|
|
<path class="arrow" d="M798,252 V318" marker-end="url(#head)"/>
|
|
<rect class="box-main" x="236" y="322" width="728" height="222" rx="14"/>
|
|
<text class="box-title" x="260" y="358">Review of the head commit</text>
|
|
<text class="label" x="560" y="358">2 to 6 minutes</text>
|
|
<text class="item" x="260" y="394">■ Rules: hard paths, secrets, size, open questions, writing rules, images</text>
|
|
<text class="item" x="260" y="424">■ Jev: risk of every changed file: security, weakened checks, categories</text>
|
|
<text class="item" x="260" y="454">■ Jev checks each changed file against the PR document and for data outflow</text>
|
|
<text class="item" x="260" y="484">■ Model review, advises or decides per host; Jev confirms its findings</text>
|
|
<text class="item" x="260" y="514">■ Risk and confirmed finding in one file or category: RED</text>
|
|
|
|
<!-- Verdicts -->
|
|
<rect x="976" y="326" width="240" height="36" rx="18" fill="#24733e"/>
|
|
<text class="pill-text" x="992" y="350">GREEN<tspan class="pill-note" dx="8">· approves</tspan></text>
|
|
<rect x="976" y="370" width="240" height="36" rx="18" fill="#d4a514"/>
|
|
<text class="pill-text pill-dark" x="992" y="394">YELLOW<tspan class="pill-note" dx="8">· a human checks</tspan></text>
|
|
<rect x="976" y="414" width="240" height="36" rx="18" fill="#e07b2e"/>
|
|
<text class="pill-text pill-dark" x="992" y="438">ORANGE<tspan class="pill-note" dx="8">· finding or high risk</tspan></text>
|
|
<rect x="976" y="458" width="240" height="36" rx="18" fill="#c0392b"/>
|
|
<text class="pill-text" x="992" y="482">RED<tspan class="pill-note" dx="8">· blocks, no override</tspan></text>
|
|
<rect x="976" y="502" width="240" height="36" rx="18" fill="#5f6b75"/>
|
|
<text class="pill-text" x="992" y="526">ERROR<tspan class="pill-note" dx="8">· an operator acts</tspan></text>
|
|
<path class="arrow" d="M964,433 H980" marker-end="url(#head)"/>
|
|
|
|
<!-- GREEN: hints back to the author, otherwise merge -->
|
|
<path d="M1216,344 H1270 V270" fill="none" stroke="#24733e" stroke-width="3" marker-end="url(#head-green)"/>
|
|
<path d="M1216,344 H1236 V706" fill="none" stroke="#24733e" stroke-width="3" marker-end="url(#head-green)"/>
|
|
<!-- YELLOW: a human -->
|
|
<path d="M1216,388 H1300 V578" fill="none" stroke="#d4a514" stroke-width="3" marker-end="url(#head-yellow)"/>
|
|
<!-- ORANGE: the author fixes, or a human checks -->
|
|
<path d="M1216,432 H1330 V270" fill="none" stroke="#e07b2e" stroke-width="3" marker-end="url(#head-orange)"/>
|
|
<path d="M1330,432 V578" fill="none" stroke="#e07b2e" stroke-width="3" marker-end="url(#head-orange)"/>
|
|
<!-- RED: only a new commit -->
|
|
<path d="M1216,476 H1356 V270" fill="none" stroke="#c0392b" stroke-width="3" marker-end="url(#head-red)"/>
|
|
|
|
<!-- The loop: each new commit is a new round -->
|
|
<path class="loop" d="M1250,206 H1110 Q1090,206 1090,226 V286 Q1090,300 1076,300 H960 V318" marker-end="url(#head-teal)"/>
|
|
<text class="label-strong" x="930" y="146" fill="#0e6b7d">each commit: a new round</text>
|
|
<text class="label" x="930" y="168">answered hints stay answered</text>
|
|
<text class="label" x="930" y="188">old text gets no new hint</text>
|
|
|
|
<!-- Human lane -->
|
|
<rect class="box" x="1286" y="582" width="264" height="100" rx="12"/>
|
|
<!-- A requested change goes back to the author -->
|
|
<path class="arrow" d="M1530,582 V270" marker-end="url(#head)"/>
|
|
<text class="box-title" x="1306" y="618">Check and approve</text>
|
|
<text class="box-text" x="1306" y="644">or ask for a change;</text>
|
|
<text class="box-text" x="1306" y="666">only for YELLOW and ORANGE</text>
|
|
<text class="label" x="740" y="612">Most pull requests never get here:</text>
|
|
<text class="label" x="740" y="634">GREEN merges after the author answered the hints.</text>
|
|
<text class="label" x="740" y="656">A PR in conflict with main is rebased first.</text>
|
|
<text class="label" x="740" y="678">An approval survives a rebase with the same changes.</text>
|
|
|
|
<!-- Gitea lane -->
|
|
<path class="arrow" d="M1418,682 V714" marker-end="url(#head)"/>
|
|
<rect class="box" x="1226" y="718" width="324" height="66" rx="12" style="fill:#e8f4ec;stroke:#24733e;stroke-width:2"/>
|
|
<text class="box-title" x="1250" y="749">Merge</text>
|
|
<text class="box-text" x="1250" y="772">automatic, once the checks pass</text>
|
|
<text class="label" x="740" y="760">Hard CI gates, tests and branch protection stay mandatory.</text>
|
|
<!-- Optional, per repository: the Codex review on a workstation -->
|
|
<rect class="box" x="236" y="718" width="480" height="66" rx="12" style="stroke-dasharray:7 5"/>
|
|
<text class="box-title" x="256" y="746">Codex review after werkrevisor, optional</text>
|
|
<text class="box-text" x="256" y="770">per repository; in gate mode it holds the merge</text>
|
|
|
|
<!-- Facts -->
|
|
<text class="stat-number" x="40" y="848">≈ 0.03 USD</text>
|
|
<text class="stat-text" x="40" y="874">per review: rules, Jev and an economy model</text>
|
|
<text class="stat-number" x="560" y="848">8 of 9</text>
|
|
<text class="stat-text" x="560" y="874">risky PRs flagged, 14 of 15 others pass, on 25 merged PRs</text>
|
|
<text class="stat-number" x="1100" y="848">RED</text>
|
|
<text class="stat-text" x="1100" y="874">lifts only with a new commit</text>
|
|
<text class="footer" x="1560" y="890" text-anchor="end">git.javagil.de/mi/werkrevisor</text>
|
|
</svg>
|