Skip to content

fix(navigation): cancel loading while preserving committed content - #759

Open
lanyue-llk wants to merge 2 commits into
mainfrom
codex/pr640-reopen-stop
Open

lanyue-llk wants to merge 2 commits into
mainfrom
codex/pr640-reopen-stop

Conversation

@lanyue-llk

@lanyue-llk lanyue-llk commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

停止加载应终止当前未完成的加载,同时保留已经提交的页面内容。旧路径混淆 provisional 导航失败、已提交文档停止解析与网络资源退役,可能把用户主动停止变成错误页,清除部分 DOM,或让旧 stylesheet/load 回调继续改变新文档生命周期。

一图看懂

PR #759 · 停止加载,保留已提交内容

图示说明问题、修复机制与行为边界;点击可查看原图。验收归属不等于当前提交通过结果,版本和测试证据见下文。

行为契约与根因

场景 预期
新导航尚未提交时 stop 取消该 target 的 provisional 加载,保留先前 committed 页面
流式文档已提交并解析一部分时 stop 保留已解析 DOM,停止后续输入与 parser 工作
真正网络失败 仍走原错误语义;不能根据错误文本包含 aborted 就当作主动取消
普通 renderer body 退役 不等于 explicit stop;网络响应捕获可继续
停止前排队的 style/load 完成 只结算原 owner 的精确 lease,不重开 load,不影响 replacement 文档
同时存在其他 target 取消和 completion token 保持 target-local

根因是多个生命周期的取消/退役被混用。本 PR 将 typed cancellation、传输取消、parser 退役和文档 load gate 的 lease 结算分别放在所属 owner 中处理,不靠错误字符串或统一清空页面绕过状态管理。

机制与代码阅读路线

  1. moli-protocol/src/domains/page/termination.rs、conn/state/page_slot.rs / runtime_slot.rs:stop 命令、target-local 取消与完成 token。
  2. conn/runtime_load.rs 和 network/main_document_progress/mod.rs:保留 typed failure/cancellation 来源,主动取消不生成错误页;保持 main 的原始字节及 XML 解码语义。
  3. renderer 的 runtime/phase_one/、owner_local_store/entry.rs、live_document_parser.rs:停止未提交加载或保留 committed partial document;明确区分 explicit stop 与普通 body 退役。
  4. frame_owner_model/load_event_gate.rs、lifecycle_blockers.rs、store.rs 与 stylesheet task:用精确 lease/owner 结算异步任务,不能按当前文档名字或全局计数结算旧回调。

28 个改动文件共同处理跨层生命周期;审查重点是各 owner 的状态迁移,而不是把 stop 的所有行为塞进一个协议函数。大段状态处理需同时看反例测试,确认正常完成、普通退役、真正失败没有被取消分支吞掉。

回归用例

契约 测试入口
typed failure 来源,不从字符串推断取消 runtime_load.rs::provisional_body_failure_preserves_typed_source_and_context / provisional_body_failure_does_not_infer_cancellation_from_error_text
普通 renderer 退役仍保留 capture runtime_load.rs::response_capture_survives_ordinary_renderer_body_retirement
target-local 与 completion token page_slot.rs::navigation_cancellation_preserves_completion_token_and_is_target_local
只由 explicit stop 取消外部传输 phase_one/streaming_input.rs::external_body_transfer_is_cancelled_only_by_explicit_stop
committed partial DOM 保留 runtime/tests/open_streaming.rs::explicit_stop_retires_open_parser_and_preserves_committed_partial_document
lease 精确取消与退役 load_event_gate.rs::stop_cancels_only_outstanding_exact_leases_without_reopening_load / retirement_discards_cancelled_leases
旧 stylesheet 回调与 replacement 隔离 stylesheet task 测试:停止前排队的回调不重开 load;旧文档回调不能结算替换文档

验收与依赖

本 PR 没有独立认领历史 35 题,以以上 stop/loading 功能契约验收。不能用其他分区的 badcase 成功代替本 PR 的状态迁移测试。

当前 HEAD dba00e5ccafa707c02ed529e5a4bfc202ba47b49,直接 base 为 main。CI 36571471129 19/19 成功。与当前 main 无冲突,因此保持原 PR 与该提交,不为追赶最新 main 再次重写已验证提交。来源:原停止加载 PR #738。

Reviewer 复现:停止加载的独立场景

本 PR 没有分配那 35 个历史 badcase。验收应检查 Stop 的状态变化,不能拿 #756/#758 的成功题目替代。下面在本 PR checkout 运行,不需要 WebArena:

cargo nextest run --no-fail-fast -p moli-renderer-v8 -p moli-protocol \
  -E 'test(explicit_stop_retires_open_parser_and_preserves_committed_partial_document) | test(navigation_cancellation_preserves_completion_token_and_is_target_local) | test(stop_cancels_only_outstanding_exact_leases_without_reopening_load) | test(stopped_document_style_event_cannot_settle_replacement_document) | test(response_capture_survives_ordinary_renderer_body_retirement) | test(provisional_body_failure_does_not_infer_cancellation_from_error_text)'
场景 复现方法与预期
已提交的流式页面 Stop 先送入 prefix,保持响应未结束,Stop 后再送入 tail。结果应为 `committed prefix
重复 Stop 同一页面再次 Stop 后,定时器仍返回 still live,页面 owner 没被销毁
target 隔离 取消当前 target 的加载,保留 completion token,不取消另一个 target
停止前排队的回调 只结算旧 owner 的精确 lease,不重开 load;替换文档不受影响
普通 body 退役 renderer 不再消费正文,网络 response capture 仍可继续;不能等同用户 Stop
真正的加载错误 不依据错误文字中的 aborted 推断用户取消,保留 typed failure

测试使用可控流和回调顺序,不依赖外部网站延迟。主要流式场景源码见 open_streaming.rs。完整指南 也列出了三项 PR 的命令和预期。

Reviewer 重点

取消发生在提交前/后是否都保留正确文档?错误与取消是否通过类型区分?普通退役是否仍允许网络 capture?停止后到达的异步回调是否只能结算其原 owner,既不重开 load,也不污染新文档或其他 target?

整组验收与证据入口

这组修复来自 #640,对应 1.1.9 的 34 个失败 case,加上 1.1.8 已失败的 386,共 35 个唯一 case。按最终职责分配为:#756 布局 27、#757 输入 4、#758 网络 3、#761 文本 1;#755、#759、#760 以各自独立功能契约验收,不重复认领这 35 个 case。

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Sequential Navigation Soak A/B

✅ HEAD completed the 200-navigation resilience and memory observation.

One browser process, one target, and one CDP session navigate CSDN → SegmentFault → Huaban → example.com repeatedly. This run issued 200 Page.navigate commands per binary.

Common ancestor 7f9b8b63d7 → HEAD dba00e5cca; benchmark order: head-first; workflow: success.

Session resilience

Metric Base HEAD
Attempted / planned 200 / 200 200 / 200
Direct observable pass 200 / 200 200 / 200
Failures / recovered 0 / 0 0 / 0
Recovery failures 0 0
Lifecycle order violations 0 0
Network order violations 0 0
Wall time 326.3 s 343.1 s

A public-page failure is reported separately from an unrecoverable session. The soak requires all navigation attempts, zero failed recovery, zero lifecycle/network ordering violations, and complete resource evidence.

Process-tree memory

Metric Base HEAD Δ
Boundary samples 200 200 0
Boundary RSS samples 200 200 0
Boundary PSS samples 200 200 0
Periodic peak RSS 219.0 MiB 218.0 MiB -1.0 MiB
Periodic peak PSS 215.1 MiB 214.8 MiB -0.2 MiB
RSS · first 10 avg 163.6 MiB 167.8 MiB +4.3 MiB
RSS · last 10 avg 160.7 MiB 161.0 MiB +0.3 MiB
RSS · last − first window -2.9 MiB -6.9 MiB -4.0 MiB
RSS · warm slope / 100 nav +1.5 MiB +1.7 MiB +0.2 MiB
PSS · first 10 avg 159.7 MiB 164.9 MiB +5.1 MiB
PSS · last 10 avg 157.3 MiB 157.9 MiB +0.5 MiB
PSS · last − first window -2.4 MiB -7.0 MiB -4.6 MiB
PSS · warm slope / 100 nav +1.7 MiB +1.6 MiB -0.0 MiB
Peak file descriptors 64 62 -2
Peak threads 31 31 0

HEAD memory by 50-navigation quarter

HEAD range Avg RSS Final RSS Peak RSS Avg PSS Final PSS Peak FD
1–50 161.3 MiB 152.6 MiB 218.9 MiB 158.3 MiB 149.7 MiB 53
51–100 162.5 MiB 134.1 MiB 206.6 MiB 159.5 MiB 130.7 MiB 53
101–150 163.4 MiB 152.6 MiB 207.0 MiB 160.2 MiB 149.2 MiB 51
151–200 163.6 MiB 138.3 MiB 208.9 MiB 160.6 MiB 135.1 MiB 53

Raw reports and per-navigation boundary samples: workflow run and full sequential-navigation-soak-results artifact.

Public-site timing and memory are observational. Use the A/B deltas and trend shape as evidence, not as a deterministic performance threshold.

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Spider Bench A/B

✅ All benchmark browser service runs completed; results are informational.

Public HEAD: 189 / 240 rows; 39 / 48 sites produced rows; 9 unexpected empty sites.

✅ Deterministic fixture contract is clean.

Common ancestor 7f9b8b63d70b → HEAD dba00e5ccafa; benchmark order: head-first; workflow: success.

Public 48-site run · informational

Metric Base HEAD Δ
Run status success success —
Extracted rows / contract 189 / 240 189 / 240 0 (0.00%)
Contract fill 78.75% 78.75% 0.00 pp (0.00%)
Sites with rows 39 / 48 39 / 48 0 (0.00%)
Sites meeting row contract 37 / 48 37 / 48 0 (0.00%)
Unexpected empty sites 9 9 0 (0.00%)
Partial-row sites 2 2 0 (0.00%)
Site outcomes extracted: 38; HTTP error + rows: 1; empty: 7; HTTP error + empty: 1; snapshot error + empty: 1 extracted: 37; HTTP error + rows: 2; empty: 6; HTTP error + empty: 1; snapshot error + empty: 2 —
Observed duration 50.83 s 50.49 s -0.34 s (-0.67%)
Estimated CPU 44.61 s 47.26 s +2.65 s (+5.94%)
Peak PSS 281.93 MiB 266.14 MiB -15.79 MiB (-5.60%)
Peak RSS 284.57 MiB 269.71 MiB -14.86 MiB (-5.22%)
Peak threads 26 27 +1 (+3.85%)
Mismatched sites 0 0 0
Timeout with items 0 0 0
Category rows Base HEAD Δ
news 35 / 40 35 / 40 0
stocks 20 / 40 20 / 40 0
tech 35 / 40 35 / 40 0
sports 32 / 40 32 / 40 0
games 37 / 40 37 / 40 0
life 30 / 40 30 / 40 0

Public-site content, timing, and memory are noisy. This single A/B run reports evidence only; site outcome counts explain missing rows without treating them as a deterministic regression.

CPU and memory timelines

These are bounded 40-point views of the same complete process-tree samples used by the HTML report. CPU uses 100% per occupied logical core; memory lines are RSS first and PSS second when complete PSS samples are available.

Base

xychart-beta
    title "Base CPU"
    x-axis "Elapsed seconds" [1.537, 2.538, 3.039, 4.54, 5.542, 7.045, 8.548, 10.05, 11.55, 13.052, 14.053, 15.555, 17.056, 18.559, 20.06, 21.562, 22.563, 24.064, 25.566, 27.068, 28.068, 28.569, 30.072, 31.073, 32.574, 34.075, 35.576, 37.078, 38.58, 39.581, 41.08, 42.582, 44.085, 45.587, 47.088, 48.09, 49.59, 50.091]
    y-axis "CPU percent" 0 --> 500
    line [115.71, 3.99, 0, 123.83, 153.68, 195.54, 173.75, 143.77, 62.03, 118.01, 131.82, 2, 2, 2, 65.94, 15.96, 11.99, 129.68, 111.73, 137.69, 110.06, 99.89, 123.77, 45.97, 139.92, 115.9, 109.96, 43.89, 3.99, 145.93, 123.88, 5.99, 9.97, 101.72, 167.86, 41.97, 104.05, 199.75]
Loading
xychart-beta
    title "Base memory: RSS then PSS"
    x-axis "Elapsed seconds" [0.034, 1.537, 2.538, 3.039, 4.54, 5.542, 7.045, 8.548, 10.05, 11.55, 13.052, 14.053, 15.555, 17.056, 18.559, 20.06, 21.562, 22.563, 24.064, 25.566, 27.068, 28.068, 28.569, 30.072, 31.073, 32.574, 34.075, 35.576, 37.078, 38.58, 39.581, 41.08, 42.582, 44.085, 45.587, 47.088, 48.09, 49.59, 50.091, 50.83]
    y-axis "Memory MiB" 0 --> 500
    line [12.3, 99.15, 95.94, 95.95, 128.77, 135.38, 137.2, 163.46, 187.91, 189.26, 179.61, 171.67, 167.89, 150.95, 150.32, 155.5, 141.54, 139.68, 161.14, 159.07, 178.31, 284.57, 209.35, 158.49, 155.74, 188.58, 163.74, 149.22, 157.29, 153.89, 197.55, 195.64, 165.37, 157.61, 180.06, 172.3, 161.93, 177.11, 189.82, 0]
    line [9.24, 95.79, 92.6, 92.6, 125.33, 131.89, 133.85, 159.98, 184.45, 185.77, 176.12, 168.18, 164.41, 147.45, 146.82, 152, 138.05, 136.19, 157.66, 155.63, 174.89, 281.93, 205.84, 155.01, 152.24, 185.1, 160.24, 145.72, 153.78, 150.38, 194.17, 192.16, 162.05, 154.11, 176.98, 169.18, 158.82, 173.98, 186.89, 0]
Loading

HEAD

xychart-beta
    title "HEAD CPU"
    x-axis "Elapsed seconds" [1.038, 1.538, 3.039, 4.042, 5.544, 7.047, 8.549, 10.05, 11.052, 12.554, 14.055, 15.557, 17.059, 18.059, 19.56, 21.063, 22.563, 24.066, 25.569, 26.57, 27.571, 28.072, 29.574, 31.074, 32.577, 33.578, 35.08, 36.581, 38.084, 39.585, 40.584, 42.086, 43.587, 45.089, 46.591, 47.593, 49.096, 50.097]
    y-axis "CPU percent" 0 --> 500
    line [0, 4, 19.99, 93.84, 117.78, 149.83, 163.81, 105.93, 185.82, 91.93, 53.95, 121.91, 27.98, 6, 57.87, 4, 43.99, 139.59, 157.62, 125.92, 109.76, 125.89, 101.77, 135.94, 133.88, 165.63, 154.07, 81.9, 9.97, 155.79, 62.06, 9.99, 11.99, 121.82, 159.8, 83.89, 123.88, 199.67]
Loading
xychart-beta
    title "HEAD memory: RSS then PSS"
    x-axis "Elapsed seconds" [0.036, 1.038, 1.538, 3.039, 4.042, 5.544, 7.047, 8.549, 10.05, 11.052, 12.554, 14.055, 15.557, 17.059, 18.059, 19.56, 21.063, 22.563, 24.066, 25.569, 26.57, 27.571, 28.072, 29.574, 31.074, 32.577, 33.578, 35.08, 36.581, 38.084, 39.585, 40.584, 42.086, 43.587, 45.089, 46.591, 47.593, 49.096, 50.097, 50.489]
    y-axis "Memory MiB" 0 --> 500
    line [11.93, 54.14, 61.21, 75.48, 115.9, 135.76, 167.99, 189.15, 161.15, 192.14, 165.3, 174.4, 178.22, 142.98, 146.02, 157.67, 148.19, 145.67, 179.49, 153.56, 191.85, 269.71, 195.32, 224.62, 167.54, 172.39, 216.32, 152.45, 152.43, 152.43, 187.03, 160.21, 151.7, 144.31, 158.17, 153.96, 152.46, 171.68, 180.73, 0]
    line [8.71, 50.63, 57.7, 72.04, 112.4, 131.46, 164.47, 185.64, 157.6, 188.9, 161.9, 170.96, 173.58, 139.72, 142.75, 154.4, 144.92, 142.4, 176.22, 150.33, 188.64, 266.14, 192.08, 221.35, 164.28, 169.12, 213.51, 149.19, 149.63, 149.17, 181.97, 157.63, 148.42, 141.03, 155.56, 152.65, 149.08, 168.33, 177.3, 0]
Loading

Deterministic fixture · required contract

The fixture exercises 15 routes: 8 are expected to emit rows and 7 intentionally exercise empty, loading, or timeout behavior.

Metric Base HEAD Δ
Run status success success —
Extracted rows / contract 40 / 40 40 / 40 0 (0.00%)
Contract fill 100.00% 100.00% 0.00 pp (0.00%)
Sites with rows 8 / 15 8 / 15 0 (0.00%)
Sites meeting row contract 15 / 15 15 / 15 0 (0.00%)
Unexpected empty sites 0 0 0
Partial-row sites 0 0 0
Site outcomes extracted: 7; HTTP error + rows: 1; empty: 3; timeout + empty: 4 extracted: 7; HTTP error + rows: 1; empty: 3; timeout + empty: 4 —
Observed duration 19.89 s 19.90 s +0.00 s (+0.01%)
Estimated CPU 0.44 s 0.36 s -0.08 s (-17.69%)
Peak PSS 58.09 MiB 58.13 MiB +0.03 MiB (+0.05%)
Peak RSS 61.30 MiB 61.15 MiB -0.16 MiB (-0.25%)
Peak threads 18 18 0 (0.00%)
Mismatched sites 0 0 0
Timeout with items 0 0 0

Full HTML, JSON, CSV, logs, and page snapshots: workflow run and full spider-bench-results artifact.

The public-web A/B is informational. The exact HEAD fixture contract runs as a separate required CI check; timing and public-site content deltas remain non-blocking.

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

CI Regression Report

Source CI run · source state at render: in_progress · artifacts: 6/6

Check Status Signal
Release regression ✅ HEAD/base failures 0/0; raw binary +0.003219%
Frontend differential ✅ 1,020/1,020 cases matched; 0 issues
Agent episodes ✅ 8/8 Moli episodes passed; 0 failures
Runtime/CDP contracts ✅ 26 contract cases; 0 failures
CDP smoke ✅ 50/50 groups passed; 574 scenarios
WebMainBench ✅ 545/545 completed; 0 unexpected failures
Release regression — ✅ HEAD/base failures 0/0; raw binary +0.003219%

Package and image size

Metric Base HEAD Delta Delta %
Raw binary 146.71 MiB 146.72 MiB +4.84 KiB +0.003219%
Stripped binary 100.68 MiB 100.68 MiB +4.00 KiB +0.003880%
gzip binary 50.22 MiB 50.22 MiB +3.90 KiB +0.007587%
Rootfs 153.61 MiB 153.62 MiB +10.00 KiB +0.006357%
gzip rootfs 59.00 MiB 59.00 MiB +3.65 KiB +0.006047%

Startup latency and PSS

Case Base p50 HEAD p50 Delta Base PSS HEAD PSS Delta
Serve ready 27.31 ms 2.49 ms −24.82 ms 5.46 MiB 8.88 MiB +3.42 MiB
CDP first page 52.73 ms 51.67 ms −1.06 ms 5.25 MiB 8.84 MiB +3.59 MiB
CDP warm page 13.52 ms 17.02 ms +3.49 ms 49.91 MiB 49.32 MiB −597.00 KiB
CLI about:blank 14.86 ms 22.17 ms +7.30 ms 2.18 MiB 4.43 MiB +2.25 MiB
CLI local JS 18.51 ms 18.07 ms −0.44 ms 3.13 MiB 3.71 MiB +589.50 KiB

Concurrency matrix

Concurrency Base p50 HEAD p50 Delta Base PSS HEAD PSS Delta HEAD failures Unstable B/H
1 17.98 ms 16.72 ms −1.26 ms 728.00 KiB 738.00 KiB +10.00 KiB 0 0/0
5 20.15 ms 19.42 ms −0.73 ms 22.54 MiB 14.67 MiB −7.87 MiB 0 0/0
10 19.59 ms 20.13 ms +0.53 ms 26.91 MiB 13.13 MiB −13.79 MiB 0 0/0
25 19.62 ms 21.17 ms +1.55 ms 12.96 MiB 26.88 MiB +13.93 MiB 0 0/0
100 20.00 ms 19.50 ms −0.49 ms 22.54 MiB 12.63 MiB −9.91 MiB 0 0/0
Frontend differential — ✅ 1,020/1,020 cases matched; 0 issues
Match DOM mismatch Diagnostic mismatch Moli error Reference error Infrastructure error Mismatched frames Duration
1,020 0 0 0 0 0 0 6m 35.47s
Agent episodes · Moli vs Chromium — ✅ 8/8 Moli episodes passed; 0 failures
Fast contract Episodes Passed Assertions Ready p50 Episode p50
Moli 8 8 47/47 4.11 ms 25.99 ms
Chromium 8 8 47/47 325.23 ms 111.94 ms
Operation p50 Chromium Moli Delta Delta %
navigate 42.10 ms 7.09 ms −35.02 ms −83.17%
observe 1.94 ms 1.00 ms −0.93 ms −48.08%
fill 5.06 ms 3.42 ms −1.64 ms −32.36%
click 3.10 ms 3.90 ms +0.80 ms +25.74%
Idle-resource episode Peak RSS Peak PSS Average CPU Peak CPU Peak processes Sampler
Moli 64.26 MiB 61.66 MiB 0.64% 10.02% 1 ✅
Chromium 1283.82 MiB 333.18 MiB 1.85% 85.79% 13 ⚠️ PSS partial
Runtime and CDP session contracts — ✅ 26 contract cases; 0 failures
Suite Cases Failures Median case p50 Median case p95 Median peak PSS p50
Synthetic fetch 13 0 17.49 ms 18.47 ms 804.00 KiB
Long-lived CDP session 13 0 19.35 ms 20.00 ms —
CDP smoke — ✅ 50/50 groups passed; 574 scenarios

Workers: 4 · cumulative group time: 131.83 s · failed groups: 0

Slowest group Scenarios Duration Status
target-lifecycle 24 12.94 s ✅
dom-input 27 10.18 s ✅
chromium-cdp 56 9.24 s ✅
multi-page 45 9.22 s ✅
layout-screenshot 5 7.05 s ✅
WebMainBench · 545 pages — ✅ 545/545 completed; 0 unexpected failures
Completed Successful Expected DNS failure Unexpected failures Panics Crashes Timeouts Empty output
545/545 544 1 0 0 0 0 0

Frozen HTML · Linux · --wait done · 45 seconds per page · no retries. Content quality is evaluated separately.

Diagnostics: webmainbench-results — every page's Markdown, stderr, and exit status. Source run and artifacts

All artifact fields are parsed by the trusted default-branch renderer; missing or invalid inputs remain visible as unavailable.

@lanyue-llk
lanyue-llk force-pushed the codex/pr640-reopen-engineering branch from 19f651f to 7649f13 Compare September 24, 2026 04:21
@lanyue-llk
lanyue-llk force-pushed the codex/pr640-reopen-stop branch from 10ff8e6 to ae716d0 Compare September 24, 2026 04:22
@lanyue-llk
lanyue-llk force-pushed the codex/pr640-reopen-engineering branch from 7649f13 to 6185ba5 Compare September 24, 2026 05:10
@lanyue-llk
lanyue-llk force-pushed the codex/pr640-reopen-stop branch from ae716d0 to 126ada4 Compare September 24, 2026 05:10
@ldm0
ldm0 force-pushed the codex/pr640-reopen-engineering branch from 008b31d to 2009cd7 Compare September 28, 2026 20:51
@lanyue-llk

Copy link
Copy Markdown
Contributor Author

已由 #955 替代:独立补丁已真实 rebase 到最新 main。旧 PR 和分支保留供溯源;后续审阅与 CI 请看 #955。

@lanyue-llk lanyue-llk closed this Sep 29, 2026
@lanyue-llk lanyue-llk reopened this Sep 29, 2026
@lanyue-llk
lanyue-llk force-pushed the codex/pr640-reopen-stop branch from 126ada4 to acb4171 Compare September 29, 2026 12:37
@lanyue-llk
lanyue-llk changed the base branch from codex/pr640-reopen-engineering to main September 29, 2026 12:37
@lanyue-llk

Copy link
Copy Markdown
Contributor Author

更正:此前“由 #955 替代”的评论已失效。#759 已恢复开放,原分支已真实 rebase 到 main;当前提交 acb4171,后续审阅请继续在本 PR 进行。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant