@henryqw/pi-subagent 27.4.3 → 27.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,236 +3,136 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Pi Subagent checked execution architecture</title>
7
- <link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
6
+ <title>Pi Subagent isolated workflow</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&amp;family=Geist:wght@400;500;600&amp;family=Geist+Mono:wght@400;500;600&amp;display=swap" rel="stylesheet">
8
8
  <style>
9
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
10
- :root {
11
- --paper: #f0eee9;
12
- --ink: #101828;
13
- --muted: #4c5665;
14
- }
15
- body {
16
- min-height: 100vh;
17
- display: flex;
18
- align-items: center;
19
- justify-content: center;
20
- padding: 48px 32px;
21
- background: var(--paper);
22
- color: var(--ink);
23
- font-family: 'Geist', sans-serif;
24
- }
25
- .frame { width: 100%; max-width: 1280px; }
26
- .eyebrow {
27
- margin-bottom: 8px;
28
- color: var(--muted);
29
- font: 500 8px 'Geist Mono', monospace;
30
- letter-spacing: .18em;
31
- text-transform: uppercase;
32
- }
33
- h1 {
34
- margin-bottom: 24px;
35
- color: var(--ink);
36
- font: 400 28px 'Instrument Serif', serif;
37
- letter-spacing: -.02em;
38
- line-height: 1.15;
39
- }
40
- svg { display: block; width: 100%; height: auto; }
9
+ * { box-sizing: border-box; }
10
+ body { margin: 0; padding: 32px; background: #f0eee9; color: #101828; font-family: 'Geist', sans-serif; }
11
+ .frame { width: 100%; max-width: 1280px; margin: auto; }
12
+ h1 { margin: 0 0 24px; font: 400 28px 'Instrument Serif', serif; }
13
+ .diagram-scroll { overflow-x: auto; }
14
+ svg { display: block; width: 100%; min-width: 1280px; height: auto; }
41
15
  </style>
42
16
  </head>
43
17
  <body>
44
18
  <main class="frame">
45
- <p class="eyebrow">Architecture · Secure paved road</p>
46
- <h1>Checked work reaches Main through one guarded path</h1>
47
-
48
- <svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="orchestration-architecture-title orchestration-architecture-desc">
49
- <title id="orchestration-architecture-title">Pi Subagent checked execution architecture</title>
50
- <desc id="orchestration-architecture-desc">Architecture diagram showing Pi Main resolving each task-selected Role just in time, returning bounded text to durable state, and sending changesets through isolated Herdr work, direct checks, optional judgment, and guarded Main integration.</desc>
51
- <defs>
52
- <style>
53
- .zone { fill: #e6e4de; stroke: #101828; stroke-opacity: .141; stroke-width: 1; }
54
- .zone-protected { fill: #1d4ed8; fill-opacity: .05; stroke: #1d4ed8; stroke-opacity: .50; stroke-width: 1; stroke-dasharray: 4 4; }
55
- .zone-label { fill: #6a7282; font: 500 8px 'Geist Mono', monospace; letter-spacing: .16em; }
56
- .node-mask { fill: #f0eee9; }
57
- .node { fill: #ffffff; stroke: #101828; stroke-width: 1; }
58
- .node-input { fill: #4c5665; fill-opacity: .10; stroke: #6a7282; stroke-width: 1; }
59
- .node-store { fill: #101828; fill-opacity: .05; stroke: #4c5665; stroke-width: 1; }
60
- .node-focal { fill: #1d4ed8; fill-opacity: .08; stroke: #1d4ed8; stroke-width: 1.2; }
61
- .tag { fill: none; stroke: #101828; stroke-opacity: .34; stroke-width: .8; }
62
- .tag-focal { fill: none; stroke: #1d4ed8; stroke-opacity: .55; stroke-width: .8; }
63
- .tag-text { fill: #6a7282; font: 500 8px 'Geist Mono', monospace; letter-spacing: .08em; text-anchor: middle; }
64
- .tag-text-focal { fill: #1d4ed8; font: 500 8px 'Geist Mono', monospace; letter-spacing: .08em; text-anchor: middle; }
65
- .name { fill: #101828; font: 600 12px 'Geist', sans-serif; text-anchor: middle; }
66
- .sub { fill: #4c5665; font: 400 8px 'Geist Mono', monospace; text-anchor: middle; }
67
- .edge { fill: none; stroke: #4c5665; stroke-width: 1.2; marker-end: url(#arrow); }
68
- .edge-approved { fill: none; stroke: #1d4ed8; stroke-width: 1.2; marker-end: url(#arrow-accent); }
69
- .edge-audit { fill: none; stroke: #4c5665; stroke-width: 1; stroke-dasharray: 5 4; marker-end: url(#arrow); }
70
- .edge-blocked { fill: none; stroke: #6a7282; stroke-width: 1; stroke-dasharray: 5 4; }
71
- .label-mask { fill: #f0eee9; }
72
- .label { fill: #4c5665; font: 500 8px 'Geist Mono', monospace; letter-spacing: .04em; text-anchor: middle; }
73
- .label-approved { fill: #1d4ed8; font: 500 8px 'Geist Mono', monospace; letter-spacing: .04em; text-anchor: middle; }
74
- .stop { fill: #f0eee9; stroke: #6a7282; stroke-width: 1.2; }
75
- .stop-mark { stroke: #6a7282; stroke-width: 1.2; }
76
- .legend { fill: #101828; font: 400 12px 'Geist', sans-serif; }
77
- .legend-label { fill: #6a7282; font: 500 8px 'Geist Mono', monospace; letter-spacing: .16em; }
78
- </style>
79
- <marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
80
- <polygon points="0 0,8 3,0 6" fill="#4c5665"/>
81
- </marker>
82
- <marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
83
- <polygon points="0 0,8 3,0 6" fill="#1d4ed8"/>
84
- </marker>
85
- <marker id="arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
86
- <polygon points="0 0,8 3,0 6" fill="#1d4ed8"/>
87
- </marker>
88
- </defs>
89
-
90
- <rect width="1280" height="720" fill="#f0eee9"/>
91
-
92
- <!-- Trust zones -->
93
- <rect class="zone" x="248" y="96" width="344" height="448" rx="8"/>
94
- <rect class="label-mask" x="260" y="100" width="152" height="16" rx="2"/>
95
- <text class="zone-label" x="268" y="112">MAIN CONTROL PLANE</text>
96
-
97
- <rect class="zone" x="624" y="96" width="304" height="448" rx="8"/>
98
- <rect class="label-mask" x="636" y="100" width="164" height="16" rx="2"/>
99
- <text class="zone-label" x="644" y="112">TASK EXECUTION CHANNELS</text>
100
-
101
- <rect class="zone-protected" x="960" y="96" width="280" height="472" rx="8"/>
102
- <rect class="label-mask" x="972" y="100" width="196" height="16" rx="2"/>
103
- <text class="zone-label" x="980" y="112">PROTECTED MAIN REPOSITORY</text>
104
-
105
- <!-- Approved and audit paths -->
106
- <line class="edge" x1="216" y1="216" x2="280" y2="216"/>
107
- <line class="edge" x1="560" y1="216" x2="656" y2="216"/>
108
- <line class="edge" x1="420" y1="272" x2="420" y2="400"/>
109
- <line class="edge" x1="776" y1="272" x2="776" y2="336"/>
110
- <line class="edge-approved" x1="776" y1="448" x2="776" y2="472"/>
111
- <line class="edge-audit" x1="656" y1="424" x2="560" y2="424"/>
112
- <line class="edge-approved" x1="896" y1="516" x2="992" y2="516"/>
113
- <path class="edge-audit" d="M1068 560 V584 Q1068 592 1060 592 H428 Q420 592 420 584 V512"/>
114
-
115
- <!-- Forbidden routes stop before crossing -->
116
- <path class="edge-blocked" d="M704 272 V296 Q704 304 696 304 H624"/>
117
- <circle class="stop" cx="624" cy="304" r="8"/>
118
- <line class="stop-mark" x1="620" y1="300" x2="628" y2="308"/>
119
- <line class="stop-mark" x1="628" y1="300" x2="620" y2="308"/>
120
-
121
- <line class="edge-blocked" x1="896" y1="420" x2="952" y2="420"/>
122
- <circle class="stop" cx="952" cy="420" r="8"/>
123
- <line class="stop-mark" x1="948" y1="416" x2="956" y2="424"/>
124
- <line class="stop-mark" x1="956" y1="416" x2="948" y2="424"/>
125
-
126
- <!-- Connector labels -->
127
- <rect class="label-mask" x="220" y="196" width="56" height="12" rx="2"/>
128
- <text class="label" x="248" y="204">EXECUTE</text>
129
-
130
- <rect class="label-mask" x="580" y="196" width="56" height="12" rx="2"/>
131
- <text class="label" x="608" y="204">LAUNCH</text>
132
-
133
- <rect class="label-mask" x="428" y="324" width="72" height="12" rx="2"/>
134
- <text class="label" x="464" y="332">CHECKPOINT</text>
135
-
136
- <rect class="label-mask" x="784" y="296" width="72" height="12" rx="2"/>
137
- <text class="label" x="820" y="304">DISPATCH</text>
138
-
139
- <rect class="label-mask" x="788" y="452" width="72" height="12" rx="2"/>
140
- <text class="label-approved" x="824" y="460">CHANGESET</text>
141
-
142
- <rect class="label-mask" x="572" y="400" width="72" height="12" rx="2"/>
143
- <text class="label" x="608" y="408">TEXT RESULT</text>
144
-
145
- <rect class="label-mask" x="916" y="496" width="56" height="12" rx="2"/>
146
- <text class="label-approved" x="944" y="504">VERIFY</text>
147
-
148
- <rect class="label-mask" x="628" y="284" width="96" height="12" rx="2"/>
149
- <text class="label" x="676" y="292">NO CONTROL API</text>
150
-
151
- <rect class="label-mask" x="900" y="400" width="48" height="12" rx="2"/>
152
- <text class="label" x="924" y="408">NO BYPASS</text>
153
-
154
- <rect class="label-mask" x="696" y="572" width="80" height="12" rx="2"/>
155
- <text class="label" x="736" y="580">AUDIT RESULT</text>
156
-
157
- <!-- Opaque node masks -->
158
- <rect class="node-mask" x="40" y="160" width="176" height="112" rx="6"/>
159
- <rect class="node-mask" x="280" y="160" width="280" height="112" rx="6"/>
160
- <rect class="node-mask" x="280" y="400" width="280" height="112" rx="6"/>
161
- <rect class="node-mask" x="656" y="160" width="240" height="112" rx="6"/>
162
- <rect class="node-mask" x="656" y="336" width="240" height="112" rx="6"/>
163
- <rect class="node-mask" x="656" y="472" width="240" height="72" rx="6"/>
164
- <rect class="node-mask" x="992" y="472" width="216" height="88" rx="6"/>
165
-
166
- <!-- Request -->
167
- <rect class="node-input" x="40" y="160" width="176" height="112" rx="6"/>
168
- <rect class="tag" x="52" y="172" width="40" height="16" rx="2"/>
169
- <text class="tag-text" x="72" y="184">INPUT</text>
170
- <text class="name" x="128" y="216">Checked request</text>
171
- <text class="sub" x="128" y="240">TASK DAG · CHECKS · BUDGET</text>
172
-
173
- <!-- Main control plane -->
174
- <rect class="node-focal" x="280" y="160" width="280" height="112" rx="6"/>
175
- <rect class="tag-focal" x="292" y="172" width="40" height="16" rx="2"/>
176
- <text class="tag-text-focal" x="312" y="184">MAIN</text>
177
- <text class="name" x="420" y="212">Pi Subagent</text>
178
- <text class="sub" x="420" y="236">PREFLIGHTS ROLE + MODEL PAIRS</text>
179
- <text class="sub" x="420" y="252">RESOLVES AGAIN AT LAUNCH</text>
180
-
181
- <rect class="node-store" x="280" y="400" width="280" height="112" rx="6"/>
182
- <rect class="tag" x="292" y="412" width="48" height="16" rx="2"/>
183
- <text class="tag-text" x="316" y="424">AUDIT</text>
184
- <text class="name" x="420" y="452">Durable request state</text>
185
- <text class="sub" x="420" y="476">CONFIG/PI-SUBAGENT/STATE</text>
186
- <text class="sub" x="420" y="492">STRICT SCHEMA · RECOVERY EVIDENCE</text>
187
-
188
- <!-- Task-selected Role and execution channels -->
189
- <rect class="node" x="656" y="160" width="240" height="112" rx="6"/>
190
- <rect class="tag" x="668" y="172" width="40" height="16" rx="2"/>
191
- <text class="tag-text" x="688" y="184">ROLE</text>
192
- <text class="name" x="776" y="212">Current configured Role</text>
193
- <text class="sub" x="776" y="236">TASK-SELECTED · RESOLVED JIT</text>
194
- <text class="sub" x="776" y="252">TOOLS · SKILLS · MCP POLICY</text>
195
-
196
- <rect class="node-store" x="656" y="336" width="240" height="112" rx="6"/>
197
- <rect class="tag" x="668" y="348" width="56" height="16" rx="2"/>
198
- <text class="tag-text" x="696" y="360">CHANNEL</text>
199
- <text class="name" x="776" y="388">Text or changeset execution</text>
200
- <text class="sub" x="776" y="412">BOUNDED TEXT · ISOLATED HERDR</text>
201
- <text class="sub" x="776" y="428">MAIN DRIFT FAILS CLOSED</text>
202
-
203
- <!-- Live-worker changeset gate -->
204
- <rect class="node" x="656" y="472" width="240" height="72" rx="6"/>
205
- <rect class="tag" x="668" y="484" width="40" height="16" rx="2"/>
206
- <text class="tag-text" x="688" y="496">CHECK</text>
207
- <text class="name" x="776" y="508">Changeset checks + judgment</text>
208
- <text class="sub" x="776" y="528">LIVE WORKER · REBASE · EXACT PATCH</text>
209
-
210
- <!-- Protected Main repository -->
211
- <rect class="node-focal" x="992" y="472" width="216" height="88" rx="6"/>
212
- <rect class="tag-focal" x="1004" y="484" width="40" height="16" rx="2"/>
213
- <text class="tag-text-focal" x="1024" y="496">GATE</text>
214
- <text class="name" x="1100" y="520">Guarded Main integration</text>
215
- <text class="sub" x="1100" y="544">IDENTITY FENCE · DECLARED ORDER</text>
216
-
217
- <!-- Legend -->
218
- <line x1="40" y1="640" x2="1240" y2="640" stroke="#101828" stroke-opacity=".141" stroke-width=".8"/>
219
- <text class="legend-label" x="40" y="672">LEGEND</text>
220
-
221
- <line class="edge-approved" x1="136" y1="668" x2="184" y2="668"/>
222
- <text class="legend" x="200" y="672">approved checked path</text>
223
-
224
- <line class="edge-audit" x1="396" y1="668" x2="444" y2="668"/>
225
- <text class="legend" x="460" y="672">durable audit record</text>
226
-
227
- <line class="edge-blocked" x1="660" y1="668" x2="700" y2="668"/>
228
- <circle class="stop" cx="708" cy="668" r="8"/>
229
- <line class="stop-mark" x1="704" y1="664" x2="712" y2="672"/>
230
- <line class="stop-mark" x1="712" y1="664" x2="704" y2="672"/>
231
- <text class="legend" x="728" y="672">blocked before boundary</text>
232
-
233
- <rect class="zone-protected" x="988" y="660" width="32" height="16" rx="4"/>
234
- <text class="legend" x="1036" y="672">trust boundary</text>
235
- </svg>
19
+ <h1>Stage ready candidates before all workers finish</h1>
20
+ <div class="diagram-scroll">
21
+ <svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="orchestration-architecture-title orchestration-architecture-desc">
22
+ <title id="orchestration-architecture-title">Pi Subagent isolated workflow</title>
23
+ <desc id="orchestration-architecture-desc">Workers commit checked candidates for Main to stage while siblings run, advance dependent waves, validate the combined tip, and explicitly promote into unchanged clean Main.</desc>
24
+ <defs>
25
+ <style>
26
+ .section { fill: #6a7282; font: 500 8px 'Geist Mono', monospace; letter-spacing: .12em; }
27
+ .node { fill: #ffffff; stroke: #101828; stroke-width: 1; }
28
+ .input { fill: #e6e4de; stroke: #6a7282; stroke-width: 1; }
29
+ .focal { fill: #1d4ed8; fill-opacity: .08; stroke: #1d4ed8; stroke-width: 1.2; }
30
+ .optional { fill: #101828; fill-opacity: .02; stroke: #4c5665; stroke-width: 1; stroke-dasharray: 4 3; }
31
+ .tag { fill: #6a7282; font: 500 8px 'Geist Mono', monospace; }
32
+ .name { fill: #101828; font: 600 12px 'Geist', sans-serif; text-anchor: middle; }
33
+ .detail { fill: #4c5665; font: 400 12px 'Geist', sans-serif; text-anchor: middle; }
34
+ .code { fill: #4c5665; font: 400 8px 'Geist Mono', monospace; text-anchor: middle; }
35
+ .edge { fill: none; stroke: #4c5665; stroke-width: 1.2; marker-end: url(#arrow); }
36
+ .branch { fill: none; stroke: #4c5665; stroke-width: 1; stroke-dasharray: 5 4; marker-end: url(#arrow); }
37
+ .approved { fill: none; stroke: #1d4ed8; stroke-width: 1.2; marker-end: url(#arrow-accent); }
38
+ .label-mask { fill: #f0eee9; }
39
+ .label { fill: #4c5665; font: 500 8px 'Geist Mono', monospace; text-anchor: middle; }
40
+ .note-title { fill: #101828; font: 600 12px 'Geist', sans-serif; }
41
+ .note { fill: #4c5665; font: 400 12px 'Geist', sans-serif; }
42
+ .key { fill: #4c5665; font: 400 12px 'Geist', sans-serif; }
43
+ </style>
44
+ <marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
45
+ <polygon points="0 0,8 3,0 6" fill="#4c5665"/>
46
+ </marker>
47
+ <marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
48
+ <polygon points="0 0,8 3,0 6" fill="#1d4ed8"/>
49
+ </marker>
50
+ </defs>
51
+ <rect width="1280" height="720" fill="#f0eee9"/>
52
+ <text class="section" x="40" y="120">CANDIDATE PRODUCTION</text>
53
+ <text class="section" x="40" y="320">MAIN'S EXPLICIT ACTIONS</text>
54
+
55
+ <!-- Draw connectors and their labels before nodes. -->
56
+ <line class="edge" x1="256" y1="208" x2="304" y2="208"/>
57
+ <line class="edge" x1="560" y1="208" x2="608" y2="208"/>
58
+ <line class="edge" x1="880" y1="208" x2="928" y2="208"/>
59
+ <line class="edge" x1="1064" y1="272" x2="1064" y2="344"/>
60
+ <line class="edge" x1="928" y1="408" x2="880" y2="408"/>
61
+ <line class="approved" x1="568" y1="408" x2="472" y2="408"/>
62
+ <line class="branch" x1="1064" y1="472" x2="1064" y2="520"/>
63
+ <path class="branch" d="M1200 564 H1224 Q1232 564 1232 556 V96 Q1232 88 1224 88 H440 Q432 88 432 96 V144"/>
64
+ <rect class="label-mask" x="884" y="388" width="40" height="12" rx="2"/>
65
+ <text class="label" x="904" y="396">SETTLED</text>
66
+ <rect class="label-mask" x="500" y="388" width="40" height="12" rx="2"/>
67
+ <text class="label" x="520" y="396">PASS</text>
68
+ <rect class="label-mask" x="1072" y="488" width="72" height="12" rx="2"/>
69
+ <text class="label" x="1108" y="496">DEPENDENTS</text>
70
+ <rect class="label-mask" x="716" y="68" width="80" height="12" rx="2"/>
71
+ <text class="label" x="756" y="76">STAGED BASE</text>
72
+
73
+ <rect class="input" x="40" y="144" width="216" height="128" rx="6"/>
74
+ <text class="tag" x="56" y="168">MAIN</text>
75
+ <text class="name" x="148" y="200">Start isolated request</text>
76
+ <text class="code" x="148" y="224">delegate_task · mode: isolated</text>
77
+ <text class="detail" x="148" y="248">Keep the durable request ID.</text>
78
+
79
+ <rect class="node" x="304" y="144" width="256" height="128" rx="6"/>
80
+ <text class="tag" x="320" y="168">WORKERS</text>
81
+ <text class="name" x="432" y="200">Commit candidates</text>
82
+ <text class="detail" x="432" y="224">Use owned worktrees.</text>
83
+ <text class="detail" x="432" y="248">No tracked or untracked changes.</text>
84
+
85
+ <rect class="node" x="608" y="144" width="272" height="128" rx="6"/>
86
+ <text class="tag" x="624" y="168">RUNNER</text>
87
+ <text class="name" x="744" y="200">Run preliminary checks</text>
88
+ <text class="detail" x="744" y="224">Include optional task judgment.</text>
89
+ <text class="detail" x="744" y="248">Bind evidence to the exact candidate.</text>
90
+
91
+ <rect class="node" x="928" y="144" width="272" height="128" rx="6"/>
92
+ <text class="tag" x="944" y="168">RUNNER → MAIN</text>
93
+ <text class="name" x="1064" y="200">Send ready follow-up</text>
94
+ <text class="detail" x="1064" y="224">Readiness is not promotion.</text>
95
+ <text class="code" x="1064" y="248">subagent_status</text>
96
+
97
+ <rect class="focal" x="928" y="344" width="272" height="128" rx="6"/>
98
+ <text class="tag" x="944" y="368">MAIN · INTEGRATION CHECKOUT</text>
99
+ <text class="name" x="1064" y="400">Stage exact candidates</text>
100
+ <text class="code" x="1064" y="424">subagent_stage</text>
101
+ <text class="detail" x="1064" y="448">Stage while siblings run.</text>
102
+
103
+ <rect class="node" x="568" y="344" width="312" height="128" rx="6"/>
104
+ <text class="tag" x="584" y="368">MAIN · AFTER THE WAVE SETTLES</text>
105
+ <text class="name" x="724" y="400">Validate the exact combined tip</text>
106
+ <text class="code" x="724" y="424">subagent_integrate validate</text>
107
+ <text class="detail" x="724" y="448">Final checks and optional final judgment</text>
108
+
109
+ <rect class="focal" x="160" y="344" width="312" height="128" rx="6"/>
110
+ <text class="tag" x="176" y="368">MAIN · EXPLICIT PROMOTION</text>
111
+ <text class="name" x="316" y="400">Promote passing work</text>
112
+ <text class="code" x="316" y="424">subagent_integrate promote</text>
113
+ <text class="detail" x="316" y="448">Main must be unchanged and clean.</text>
114
+
115
+ <rect class="optional" x="928" y="520" width="272" height="88" rx="6"/>
116
+ <text class="name" x="1064" y="544">Advance dependent tasks</text>
117
+ <text class="code" x="1064" y="564">subagent_integrate advance</text>
118
+ <text class="detail" x="1064" y="588">Run from the selected staged snapshot.</text>
119
+
120
+ <!-- Safety details remain in the README as text. -->
121
+ <text class="note-title" x="40" y="536">Blocked promotion preserves evidence.</text>
122
+ <text class="note" x="40" y="560">Failures, conflicts, changed identities, or uncertain</text>
123
+ <text class="note" x="40" y="580">outcomes require inspection, not replay.</text>
124
+ <text class="note-title" x="520" y="536">One combined correction</text>
125
+ <text class="note" x="520" y="560">After a definitive combined check or review failure,</text>
126
+ <text class="note" x="520" y="580">commit one correction, record it, then validate again.</text>
127
+
128
+ <line x1="40" y1="640" x2="1240" y2="640" stroke="#101828" stroke-opacity=".141"/>
129
+ <line class="edge" x1="40" y1="672" x2="88" y2="672"/>
130
+ <text class="key" x="104" y="676">Checked sequence</text>
131
+ <line class="branch" x1="304" y1="672" x2="352" y2="672"/>
132
+ <text class="key" x="368" y="676">Dependent wave, if needed</text>
133
+ <text class="key" x="704" y="676">Staging, validation, and promotion require exact, clean Main.</text>
134
+ </svg>
135
+ </div>
236
136
  </main>
237
137
  </body>
238
138
  </html>