docs: pay v2 P2-P8 依赖 DAG + 并行执行边界分析
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,11 @@
|
||||
<div class="desc">阅读版;执行真相源 <code>docs/superpowers/plans/2026-07-10-pay-v2-p1-core-model.md</code>(含 checkbox)。<a href="./pay-v2-unified-gateway-design.html">pay v2 设计</a>的首个落地阶段(8 阶段之 P1)。4 个 TDD 任务:money 包(int64 最小单位+币种)→ Order/Attempt/Account/Refund 模型+状态机+<code>:memory:</code> 测试约定 → OrderStore(幂等标付/取消/列表,条件UPDATE+RowsAffected)→ 账户配置注册表(凭证走 env)。沿用 GORM AutoMigrate/glebarez sqlite 惯例;金额从 string 元改 int64。P2-P8(Provider/收款管线/渠道 adapter/退款/路由/对账/codes 库/订阅)各自成计划、落地前细化。</div>
|
||||
<div class="meta">P1 · 2026-07-10 · Go(Gin+GORM+sqlite) · 待执行</div>
|
||||
</a>
|
||||
<a class="doc" href="./pay-v2-roadmap-dag.html">
|
||||
<div class="title">pay v2 · P2-P8 依赖 DAG 与并行执行</div>
|
||||
<div class="desc">P1 已完成。P2-P8 的依赖关系图(SVG DAG)+ 关键路径 P2→P3→P4/P6 + 波次(P7 全程并行/P5∥P3/P4∥P6)+ 同仓并行的真实边界(先计划后实现、worktree 隔离防冲突)。</div>
|
||||
<div class="meta">roadmap · 2026-07-10 · 8 阶段依赖分析</div>
|
||||
</a>
|
||||
<p class="empty">运行与联调步骤见仓库根 README.md</p>
|
||||
|
||||
<h2>🔧 排障 Runbook</h2>
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>pay v2 · P2-P8 依赖 DAG 与并行执行</title>
|
||||
<style>
|
||||
:root{--bg:#0d1117;--card:#161b22;--card-2:#1c2330;--border:#283041;--fg:#e6edf3;--fg-soft:#aeb9c7;--muted:#7d8896;--accent:#58a6ff;--ok:#3fb950;--warn:#d29922;--radius:14px;--mono:"SF Mono",ui-monospace,Menlo,Consolas,monospace}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:radial-gradient(1200px 600px at 80% -10%,rgba(88,166,255,.08),transparent 60%),var(--bg);color:var(--fg);font:15px/1.7 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif}
|
||||
.wrap{max-width:1000px;margin:0 auto;padding:44px 24px 96px}
|
||||
.back{display:inline-block;margin-bottom:18px;font-size:13px}
|
||||
a{color:var(--accent);text-decoration:none}
|
||||
h1{font-size:26px;margin:6px 0 8px}
|
||||
.lead{color:var(--fg-soft);margin:0 0 22px}
|
||||
h2{font-size:18px;margin:34px 0 10px;color:var(--accent);border-bottom:1px solid var(--border);padding-bottom:8px}
|
||||
code{font-family:var(--mono);font-size:.85em;background:var(--card-2);padding:1px 6px;border-radius:5px;color:#cdd9e5}
|
||||
b{color:#fff}
|
||||
table{width:100%;border-collapse:collapse;margin:14px 0;font-size:13.5px}
|
||||
th,td{text-align:left;padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:top}
|
||||
th{color:var(--fg-soft);font-weight:600;font-size:13px}
|
||||
table.fields td:first-child{font-family:var(--mono);font-size:12px;color:#cdd9e5;white-space:nowrap;width:1%}
|
||||
.svgwrap{overflow-x:auto;background:#0a0e14;border:1px solid var(--border);border-radius:12px;padding:10px 6px;margin:16px 0}
|
||||
.tag{display:inline-block;font-size:12px;font-weight:600;padding:2px 9px;border-radius:999px}
|
||||
.tag.ok{background:rgba(63,185,80,.16);color:var(--ok)}
|
||||
.tag.par{background:rgba(210,153,34,.16);color:var(--warn)}
|
||||
.tag.info{background:rgba(88,166,255,.16);color:var(--accent)}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<a class="back" href="index.html">← 返回文档索引</a>
|
||||
<h1>pay v2 · P2-P8 依赖 DAG 与并行执行</h1>
|
||||
<p class="lead">P1 已完成。本页给出 P2-P8 的依赖关系(DAG)、关键路径、以及"多 agent 并行"在同一仓工程里的真实可并行边界。设计见 <a href="pay-v2-unified-gateway-design.html">pay v2 设计</a>,P1 见 <a href="pay-v2-p1-plan.html">P1 计划</a>。</p>
|
||||
|
||||
<h2>依赖 DAG</h2>
|
||||
<div class="svgwrap">
|
||||
<svg viewBox="0 0 940 400" style="width:100%;min-width:820px;height:auto;display:block" font-family="'SF Mono',ui-monospace,'PingFang SC',sans-serif" role="img" aria-label="P2-P8 依赖 DAG">
|
||||
<defs>
|
||||
<marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#58a6ff"/></marker>
|
||||
</defs>
|
||||
<style>
|
||||
.n{fill:#161b22;stroke:#283041;stroke-width:1.2;rx:9}
|
||||
.nd{fill:#12251a;stroke:#2ea043;stroke-width:1.4}
|
||||
.npar{fill:#231d10;stroke:#9e7016;stroke-width:1.4}
|
||||
.t{fill:#e6edf3;font-size:12.5px;font-weight:600}
|
||||
.ts{fill:#8aa0b8;font-size:10px}
|
||||
.e{stroke:#3d5578;stroke-width:1.6;fill:none}
|
||||
.lbl{fill:#8aa0b8;font-size:9.5px}
|
||||
</style>
|
||||
|
||||
<!-- edges (draw first, under nodes) -->
|
||||
<!-- P1->P2 -->
|
||||
<line class="e" x1="150" y1="60" x2="248" y2="90" marker-end="url(#a)"/>
|
||||
<!-- P2->P3 -->
|
||||
<line class="e" x1="378" y1="88" x2="470" y2="66" marker-end="url(#a)"/>
|
||||
<!-- P2->P5 -->
|
||||
<line class="e" x1="378" y1="104" x2="470" y2="196" marker-end="url(#a)"/>
|
||||
<!-- P3->P4 -->
|
||||
<line class="e" x1="600" y1="52" x2="690" y2="40" marker-end="url(#a)"/>
|
||||
<!-- P3->P6 -->
|
||||
<line class="e" x1="600" y1="66" x2="690" y2="128" marker-end="url(#a)"/>
|
||||
<!-- P3->P8 -->
|
||||
<line class="e" x1="600" y1="78" x2="690" y2="214" marker-end="url(#a)"/>
|
||||
|
||||
<!-- nodes -->
|
||||
<rect class="nd" x="24" y="34" width="126" height="52" rx="9"/>
|
||||
<text class="t" x="38" y="56">P1 数据模型</text><text class="ts" x="38" y="72">✅ 已完成</text>
|
||||
|
||||
<rect class="n" x="250" y="66" width="130" height="56" rx="9"/>
|
||||
<text class="t" x="264" y="88">P2 Provider 抽象</text><text class="ts" x="264" y="104">收款管线+webhook v2</text><text class="ts" x="264" y="116">关键路径起点</text>
|
||||
|
||||
<rect class="n" x="472" y="30" width="130" height="52" rx="9"/>
|
||||
<text class="t" x="486" y="52">P3 渠道 adapter</text><text class="ts" x="486" y="68">crypto/支付宝/Stripe</text>
|
||||
|
||||
<rect class="n" x="472" y="176" width="130" height="52" rx="9"/>
|
||||
<text class="t" x="486" y="198">P5 多账户路由</text><text class="ts" x="486" y="214">∥ P3(不同区域)</text>
|
||||
|
||||
<rect class="n" x="692" y="16" width="128" height="48" rx="9"/>
|
||||
<text class="t" x="706" y="37">P4 退款</text><text class="ts" x="706" y="53">POST /refunds 三向</text>
|
||||
|
||||
<rect class="n" x="692" y="104" width="128" height="48" rx="9"/>
|
||||
<text class="t" x="706" y="125">P6 对账 job</text><text class="ts" x="706" y="141">query 兜底</text>
|
||||
|
||||
<rect class="n" x="692" y="192" width="128" height="48" rx="9"/>
|
||||
<text class="t" x="706" y="213">P8 订阅/拒付</text><text class="ts" x="706" y="229">later,优先级低</text>
|
||||
|
||||
<!-- P7 parallel, isolated -->
|
||||
<rect class="npar" x="24" y="300" width="300" height="64" rx="9"/>
|
||||
<text class="t" x="40" y="324">P7 codes 共享库(A 嵌入各产品)</text>
|
||||
<text class="ts" x="40" y="342">独立 Go 模块 · 零依赖 pay 收款管线</text>
|
||||
<text class="ts" x="40" y="356">▶ 全程可并行(worktree 隔离,与 P2-P6 同步推进)</text>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<h2>依赖表 + 可并行性</h2>
|
||||
<table>
|
||||
<thead><tr><th>阶段</th><th>内容</th><th>依赖</th><th>可并行?</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><b>P2</b></td><td>Provider 抽象 + 一次性收款管线(create/verify_callback/query)+ webhook v2 event_type + 幂等/金额核对</td><td>P1</td><td>关键路径,单独做</td></tr>
|
||||
<tr><td><b>P3</b></td><td>首批渠道 adapter:crypto 自托管 / 支付宝 / Stripe</td><td>P2(Provider 接口)</td><td><span class="tag par">∥ P5</span> · 三个 adapter 之间也可并行(worktree)</td></tr>
|
||||
<tr><td><b>P5</b></td><td>多账户路由策略(round_robin/weighted/limit_aware/地址池)</td><td>P1(账户注册表)+ P2(create 选账户)</td><td><span class="tag par">∥ P3</span>(渠道无关,不同区域)</td></tr>
|
||||
<tr><td><b>P4</b></td><td>退款 POST /refunds + 三向(业务/crypto人工/平台通知)</td><td>P2(事件)+ P3(渠道 refund)</td><td><span class="tag par">∥ P6</span></td></tr>
|
||||
<tr><td><b>P6</b></td><td>对账 job(每 provider query,渠道流水 vs 本地订单)</td><td>P2(query)+ P3(渠道)</td><td><span class="tag par">∥ P4</span></td></tr>
|
||||
<tr><td><b>P7</b></td><td>codes 共享库(A 嵌入各产品:码模型/状态机/生成/防双花兑换/批次/审计+叠加算法)</td><td><b>无</b>(独立模块)</td><td><span class="tag par">全程并行</span> · worktree 隔离</td></tr>
|
||||
<tr><td><b>P8</b></td><td>订阅/recurring(4 类 kind)+ 拒付 chargeback</td><td>P2(事件)+ P3(渠道)</td><td>later,优先级低</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>关键路径 & 波次</h2>
|
||||
<table class="fields">
|
||||
<thead><tr><th>波次</th><th>可同时推进</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Wave 0</td><td><b>P7</b>(独立,立即并行)</td></tr>
|
||||
<tr><td>Wave 1</td><td><b>P2</b>(关键路径,单独)</td></tr>
|
||||
<tr><td>Wave 2</td><td><b>P3 ∥ P5</b>(P3 内三 adapter 亦可再并行)</td></tr>
|
||||
<tr><td>Wave 3</td><td><b>P4 ∥ P6</b></td></tr>
|
||||
<tr><td>Wave 4</td><td><b>P8</b>(可延后)</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>关键路径 = <b>P2 → P3 → P4/P6</b>(串行);P7 全程旁路并行;P5 挂在 P2 后、与 P3 并行。</p>
|
||||
|
||||
<h2>并行执行的真实边界(诚实说)</h2>
|
||||
<table>
|
||||
<thead><tr><th>约束</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>先计划后实现</td><td>P2-P8 目前只是路线图条目,<b>每阶段要先写详细计划</b>(像 P1 那样 TDD bite-sized)才能派实现 subagent。且下游计划依赖上游接口定稿(P3 计划要等 P2 的 Provider 接口定了才能写准)。</td></tr>
|
||||
<tr><td>同仓并行会冲突</td><td>SDD 铁律:同一仓不并行派实现 subagent(改文件/git 冲突)。要并行必须<b>各开 git worktree 隔离</b>,最后合并。</td></tr>
|
||||
<tr><td>真正安全的并行</td><td><b>P7</b>(独立模块,零重叠)——立即可并行,收益最大。P3∥P5、P4∥P6 需 worktree 隔离 + 清晰文件边界。</td></tr>
|
||||
<tr><td>关键路径本质串行</td><td>P2→P3→P4/P6 有硬依赖,不能并行;并行只能压缩旁路(P7/P5)的墙上时间。</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="lead" style="margin-top:16px">→ 现实策略:<b>P7 立即并行起跑</b>;关键路径逐阶段"写计划→SDD 执行";P5 在 P2 后与 P3 并行(worktree)。这是多会话、较大 token 的工程。</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user