Skip to content

fix(renderer): export live rendered content through shared markdown conversion - #1337

Open
lanyue-llk wants to merge 1 commit into
codex/content-tables-fragmentsfrom
codex/content-rendered-state
Open

lanyue-llk wants to merge 1 commit into
codex/content-tables-fragmentsfrom
codex/content-rendered-state

Conversation

@lanyue-llk

@lanyue-llk lanyue-llk commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

问题与方案

序列化 HTML 不能完整反映页面当前状态:继承的隐藏样式与子元素自身样式、加载占位内容、折叠详情、动画终态、用户修改后的表单值和已解析资源地址,都可能影响导出的内容。只检查 HTML 属性会混入占位文字,也会误删可读正文。

本 PR 把真实页面状态接到共享转换器:

  • 区分自身可见性与继承结果,保留可见子元素和折叠详情,排除不可读的加载占位、透明副本及离屏辅助内容。
  • 使用 Stylo 提供的样式来源和最终 opacity 贡献;只在受支持的有界动画规则内计算终态,避免仅因出现 animation 属性就认定正文已显示。
  • 导出当前表单值、图片资源和相对地址,保留 CSS 文字边界及上下标语义。
  • CSS 读取保持集中,缓存一次导出所需的状态;导出不点击页面、不改写 DOM。

根因、方案与验收

问题 根因 方案依据 泛化验收
可见子元素被隐藏祖先误删 最终继承值无法说明元素是否建立了自身可见性 从 Stylo 的真实 cascade 获取样式来源,按路径判断内容 hidden/inherit/invalid、变量、优先级与 layer、document/shadow scope、可见覆盖与折叠详情
一次性淡入正文长期消失 导出只看初始 opacity;字符串猜测无法恢复真实动画效果顺序 使用 Stylo 结构化终态贡献,按原槽位有序组合效果 空槽位、转义动画名、覆盖与重复终点、中性终点、无 forward fill、paused/infinite 及规模约束
初始属性覆盖用户当前状态 序列化 value/checked 不等于当前控件值 浏览器层采样当前状态,再交共享转换器 动态修改及清空 textarea、表单状态、已解析资源及相对地址;导出前后 DOM 不变
文字边界和旧 HTML 颜色语义丢失 导出忽略计算后的布局与文字表现;颜色提示未进入 cascade 传递布局/文字边界;颜色进入统一样式计算与失效路径 CSS 上下标、块和内联边界、白底/黑底、作者样式覆盖及动态颜色修改

CSS 语义的来源是 Stylo PR #2。固定提交包含 main 现有依赖;Stylo PR #1 的环境文字缩放是另一组能力,不是这里的前置条件。

动画效果按原始槽位处理 NoEffect、Underlying、Replace、Unknown。无终态保留效果的动画不会抹掉下层 opacity;无法确定的效果不能充当正文可见的证据。图中的单次淡入只展示一个受支持场景。

修复机制图

单次淡入示例:初始透明值与最终阅读状态

flowchart LR
  A[当前 DOM 与表单状态] --> D[Markdown DOM 适配]
  B[Stylo 样式来源与终态贡献] --> C[计算可读内容及边界]
  C --> D
  E[当前资源与页面 URL] --> D
  D --> F[共享 html2md 转换器]
  F --> G[保留正文、详情与语义结构]
Loading

范围与依赖

这是 #919 的运行时适配部分,基于 #1336 的 codex/content-tables-fragments;前置规则按 #1334 → #1335 → #1336 顺序提供。本组仅依赖 #1336 的公开 DOM 边界及共享转换接口。Stylo 依赖固定为 1032a2947ec2f7cee1027d07084203be87e17643,该提交包含当前 main 的依赖 0c7e8baf63b6714e7614834fadbc09710f3c3d27,增加样式来源与最终 opacity 接口。

与当前 main 的冲突保留了 ComputedStyleRead,只补入本组的可见性查询。#919 早期关联的 parser 恢复修复已经在 main,本次无需再次复制。

验证

  • 原生 DOM 导出专项:22 个场景通过。

真实页面专项测试覆盖隐藏继承与覆盖、折叠内容、懒加载占位、动画终态及覆盖、文字与背景对比、表单实时修改、资源 URL、CSS 文本边界和导出前后的 DOM 不变性。CLI 场景验证布局及数据表格导出。完整仓库测试交由 CI。

  • cargo fmt --all、构建元数据锁定检查和 diff 检查:通过。
  • cargo test -p moli-renderer-v8 --locked --lib runtime::page_vm::tests::markdown_dump::markdown_uses_live_visibility_and_preserves_disclosure_content -- --exact:1 个专项通过,8949 个其他测试未执行。
  • cargo test -p moli --locked --test fetch_cli markdown:::4 个 CLI 场景全部通过,包括布局表格、数据表格及无表头表格,在有无布局模式下核验导出。

与 #1305 的关系

#1305 直接基于 main,负责执行调用者明确指定的脚本,等待 Promise 和导航后走标准导出路径。这四组修复负责导出内容的完整性与语义。双方没有代码前置依赖;组合后,交互后的 DOM 会使用这些共享转换规则。

默认只读采集和明确交互采集是不同的测量协议。报告中的历史成绩仍绑定原调用协议;不能给单一方法补交互后替换同一行成绩。

报告

完整 WebMainBench 报告 保留原已发布的完整运行:Moli 1.1.11,源码 721bd2e329f96c06573db6e6b257a149cf17a6fe,545/545 目标正文。该运行不对应拆分后的新分支。

四组组合的生产代码及依赖锁定与 #919 净修复叠加该 main 后的冻结参考完全一致。原有场景覆盖保留;原生 DOM 验收随所属转换规则拆分,并增加不可用图片标签场景。HTTP 测试固定响应日期,消除跨秒比较的偶发失败。README 把差异数量 12 更正为 13。拆分没有生成新的基准分数。

已发布完整组合的实测证据

下表属于报告中已经认证的完整组合,源码为 721bd2e329f96c06573db6e6b257a149cf17a6fe,release 二进制 SHA-256 为 fac987f54939fab2f5db7bf54af41b25cbb3aed3230528c170b4c22ada0b98ac。它不是本 PR 单独带来的收益,也不是 rebase 后的新测量。

方法 目标正文 综合分 全文 代码 公式 表格内容 表格结构
Moli 1.1.9 543/545 36.41% 41.45% 90.87% 20.29% 17.31% 12.12%
Moli 1.1.9 · PR785 修复版 545/545 36.53% 41.72% 90.80% 20.25% 17.75% 12.11%
Moli 1.1.11 · 原 PR919 完整组合 545/545 39.27% 40.73% 91.06% 28.20% 22.62% 13.75%

分项公共总体为全文 545、代码 110、公式 257、表格内容与结构各 179;综合分为五项均值的等权平均,目标正文数量另列。完整报告保留七种方法、逐页结果和失败分析。

后续文档 PR

#1380 以本分支为基线,统一整理中英文 README 的评测说明并加入 Web Fetch 结果;仅含文档修改,待本 PR 合入后再合入。

PR stack

GitHub 原生依赖链:#1334 → #1335 → #1336 → #1337 → #1380 → #1428 → #1431 → #1432。

每个 PR 的 GitHub base 都是左侧紧邻分支,因此 Files changed 只显示本层增量。按从左到右的顺序合入。#919 是保留的历史完整组合,不是这条链的依赖;#1429 独立面向 main,只提供通用 CI 评测入口。

@github-actions

github-actions Bot commented Oct 9, 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 59c3c4d39c → HEAD 1acd30dde6; benchmark order: base-first; workflow: success.

Session resilience

Metric Base HEAD
Attempted / planned 200 / 200 200 / 200
Direct observable pass 199 / 200 199 / 200
Failures / recovered 1 / 1 1 / 1
Recovery failures 0 0
Lifecycle order violations 0 0
Network order violations 0 0
Wall time 443.1 s 465.3 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 288.9 MiB 265.1 MiB -23.8 MiB
Periodic peak PSS 285.3 MiB 261.7 MiB -23.6 MiB
RSS · first 10 avg 180.9 MiB 177.9 MiB -3.1 MiB
RSS · last 10 avg 193.0 MiB 187.3 MiB -5.7 MiB
RSS · last − first window +12.1 MiB +9.4 MiB -2.6 MiB
RSS · warm slope / 100 nav +6.7 MiB +4.4 MiB -2.3 MiB
PSS · first 10 avg 177.5 MiB 174.5 MiB -3.0 MiB
PSS · last 10 avg 189.5 MiB 183.9 MiB -5.6 MiB
PSS · last − first window +11.9 MiB +9.4 MiB -2.6 MiB
PSS · warm slope / 100 nav +6.7 MiB +4.5 MiB -2.2 MiB
Peak file descriptors 59 61 2
Peak threads 30 29 -1

HEAD memory by 50-navigation quarter

HEAD range Avg RSS Final RSS Peak RSS Avg PSS Final PSS Peak FD
1–50 180.5 MiB 161.9 MiB 224.6 MiB 177.2 MiB 158.5 MiB 52
51–100 186.9 MiB 178.8 MiB 232.9 MiB 183.5 MiB 175.5 MiB 52
101–150 189.9 MiB 171.6 MiB 225.7 MiB 186.6 MiB 168.2 MiB 52
151–200 190.0 MiB 140.6 MiB 235.4 MiB 186.7 MiB 137.3 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 Oct 9, 2026 •

Copy link
Copy Markdown

Spider Bench A/B

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

Public HEAD: 184 / 240 rows; 38 / 48 sites produced rows; 10 unexpected empty sites.

✅ Deterministic fixture contract is clean.

Common ancestor 59c3c4d39cd2 → HEAD 1acd30dde674; benchmark order: base-first; workflow: success.

Public 48-site run · informational

Metric Base HEAD Δ
Run status success success —
Extracted rows / contract 184 / 240 184 / 240 0 (0.00%)
Contract fill 76.67% 76.67% 0.00 pp (0.00%)
Sites with rows 38 / 48 38 / 48 0 (0.00%)
Sites meeting row contract 36 / 48 36 / 48 0 (0.00%)
Unexpected empty sites 10 10 0 (0.00%)
Partial-row sites 2 2 0 (0.00%)
Site outcomes extracted: 36; HTTP error + rows: 2; empty: 7; HTTP error + empty: 1; snapshot error + empty: 2 extracted: 37; HTTP error + rows: 1; empty: 7; HTTP error + empty: 1; snapshot error + empty: 2 —
Observed duration 46.11 s 70.10 s +23.98 s (+52.01%)
Estimated CPU 48.33 s 50.73 s +2.40 s (+4.97%)
Peak PSS 269.54 MiB 291.48 MiB +21.94 MiB (+8.14%)
Peak RSS 273.50 MiB 294.33 MiB +20.83 MiB (+7.62%)
Peak threads 27 26 -1 (-3.70%)
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 27 / 40 27 / 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.036, 1.537, 2.538, 4.039, 5.04, 6.541, 8.043, 9.043, 10.545, 11.546, 13.049, 14.05, 15.551, 17.054, 18.056, 19.557, 20.558, 22.06, 23.562, 24.562, 25.564, 26.065, 27.067, 28.568, 29.569, 31.072, 32.575, 33.575, 35.076, 36.077, 37.578, 39.081, 40.082, 41.583, 42.584, 44.085, 44.585, 45.085]
    y-axis "CPU percent" 0 --> 500
    line [1.99, 57.99, 127.8, 132.05, 151.55, 125.91, 177.8, 127.96, 167.86, 31.98, 101.89, 49.87, 121.9, 123.74, 77.82, 19.99, 57.97, 59.94, 119.9, 74.04, 115.68, 109.83, 117.81, 75.9, 155.88, 137.79, 113.81, 129.93, 23.93, 81.92, 107.8, 3.99, 75.91, 122.03, 55.91, 132.04, 195.96, 123.98]
Loading
xychart-beta
    title "Base memory: RSS then PSS"
    x-axis "Elapsed seconds" [0.035, 1.036, 1.537, 2.538, 4.039, 5.04, 6.541, 8.043, 9.043, 10.545, 11.546, 13.049, 14.05, 15.551, 17.054, 18.056, 19.557, 20.558, 22.06, 23.562, 24.562, 25.564, 26.065, 27.067, 28.568, 29.569, 31.072, 32.575, 33.575, 35.076, 36.077, 37.578, 39.081, 40.082, 41.583, 42.584, 44.085, 44.585, 45.085, 46.114]
    y-axis "Memory MiB" 0 --> 500
    line [12.39, 62.03, 100.54, 117.96, 143.36, 162.71, 142.68, 177.34, 167.88, 171.96, 171.08, 176.18, 174.95, 170.3, 158.32, 168.98, 148.13, 152.31, 180.29, 178.32, 201.72, 273.5, 196.84, 218.13, 158.2, 162.33, 204.98, 160.9, 162.96, 155.57, 178.19, 168.83, 177.75, 177.68, 184.99, 154.89, 192.66, 211.68, 203.67, 0]
    line [9.16, 58.46, 96.96, 114.38, 139.79, 159.13, 139.09, 173.78, 164.45, 168.38, 168.22, 172.58, 171.35, 166.7, 154.75, 165.39, 144.53, 148.58, 176.12, 174.06, 198.15, 269.54, 193.32, 214.7, 154.26, 158.76, 201.81, 157.35, 159.36, 151.97, 175.02, 165.31, 174.15, 173.4, 180.49, 151.29, 189.21, 208.12, 200.08, 0]
Loading

HEAD

xychart-beta
    title "HEAD CPU"
    x-axis "Elapsed seconds" [1.039, 2.039, 3.541, 4.042, 6.044, 8.046, 9.547, 11.549, 13.553, 15.554, 17.555, 19.559, 21.564, 23.566, 25.569, 27.071, 29.073, 31.076, 33.078, 35.081, 37.083, 39.087, 41.089, 43.091, 44.592, 46.595, 48.598, 50.599, 52.601, 54.603, 56.607, 58.609, 60.613, 62.116, 64.119, 66.122, 68.124, 69.626]
    y-axis "CPU percent" 0 --> 500
    line [0, 137.96, 113.83, 109.82, 137.98, 95.97, 175.75, 179.79, 73.92, 133.86, 7.99, 7.98, 5.98, 5.99, 5.99, 0, 0, 0, 0, 0, 2, 123.94, 77.97, 49.99, 115.92, 107.77, 109.97, 105.91, 127.71, 89.88, 13.97, 159.71, 3.99, 71.85, 112.05, 37.92, 137.73, 215.91]
Loading
xychart-beta
    title "HEAD memory: RSS then PSS"
    x-axis "Elapsed seconds" [0.038, 1.039, 2.039, 3.541, 4.042, 6.044, 8.046, 9.547, 11.549, 13.553, 15.554, 17.555, 19.559, 21.564, 23.566, 25.569, 27.071, 29.073, 31.076, 33.078, 35.081, 37.083, 39.087, 41.089, 43.091, 44.592, 46.595, 48.598, 50.599, 52.601, 54.603, 56.607, 58.609, 60.613, 62.116, 64.119, 66.122, 68.124, 69.626, 70.096]
    y-axis "Memory MiB" 0 --> 500
    line [12.53, 55.22, 114.72, 124.67, 136.34, 156.66, 166.9, 163.11, 166.23, 146.57, 172.78, 147.91, 149.54, 149.42, 149.42, 149.42, 149.42, 149.42, 149.42, 149.42, 149.42, 149.42, 170.77, 152.18, 175.13, 169.25, 294.33, 219.25, 167.39, 185.25, 153, 153.7, 190.02, 152.73, 171.06, 162.01, 154.47, 175.66, 202.11, 0]
    line [9.32, 51.68, 111.16, 120.6, 132.81, 153.34, 163.55, 159.57, 162.64, 142.98, 169.24, 144.28, 145.94, 145.82, 145.82, 145.82, 145.82, 145.82, 145.98, 145.93, 145.93, 146.04, 167.39, 148.79, 171.75, 166, 291.48, 215.93, 164, 182.02, 149.62, 150.31, 186.65, 149.34, 167.68, 158.6, 151.21, 172.04, 198.87, 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.87 s 19.86 s -0.01 s (-0.03%)
Estimated CPU 0.43 s 0.43 s -0.00 s (-0.23%)
Peak PSS 66.23 MiB 66.60 MiB +0.37 MiB (+0.56%)
Peak RSS 69.80 MiB 70.15 MiB +0.35 MiB (+0.50%)
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 Oct 9, 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.104972%
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 ✅ 52/52 groups passed; 621 scenarios
WebMainBench ✅ 545/545 completed; 0 unexpected failures
Release regression — ✅ HEAD/base failures 0/0; raw binary +0.104972%

Package and image size

Metric Base HEAD Delta Delta %
Raw binary 148.88 MiB 149.03 MiB +160.03 KiB +0.104972%
Stripped binary 102.53 MiB 102.66 MiB +140.00 KiB +0.133349%
gzip binary 51.08 MiB 51.15 MiB +71.38 KiB +0.136446%
Rootfs 155.78 MiB 155.94 MiB +160.00 KiB +0.100301%
gzip rootfs 59.97 MiB 60.05 MiB +79.89 KiB +0.130086%

Startup latency and PSS

Case Base p50 HEAD p50 Delta Base PSS HEAD PSS Delta
Serve ready 27.34 ms 28.20 ms +0.86 ms 4.42 MiB 4.58 MiB +166.50 KiB
CDP first page 50.91 ms 54.26 ms +3.36 ms 4.29 MiB 4.29 MiB +5.50 KiB
CDP warm page 11.30 ms 13.42 ms +2.12 ms 49.83 MiB 48.92 MiB −934.50 KiB
CLI about:blank 15.47 ms 17.98 ms +2.51 ms 4.70 MiB 2.96 MiB −1.74 MiB
CLI local JS 22.52 ms 21.64 ms −0.88 ms 2.81 MiB 4.94 MiB +2.13 MiB

Concurrency matrix

Concurrency Base p50 HEAD p50 Delta Base PSS HEAD PSS Delta HEAD failures Unstable B/H
1 19.74 ms 19.71 ms −0.04 ms 727.00 KiB 715.00 KiB −12.00 KiB 0 0/0
5 21.35 ms 22.45 ms +1.10 ms 13.14 MiB 27.82 MiB +14.68 MiB 0 0/0
10 21.80 ms 21.91 ms +0.11 ms 13.26 MiB 13.20 MiB −63.00 KiB 0 0/0
25 21.38 ms 22.68 ms +1.30 ms 27.81 MiB 13.85 MiB −13.96 MiB 0 0/0
100 22.04 ms 22.34 ms +0.29 ms 13.49 MiB 27.76 MiB +14.28 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 44.68s
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.42 ms 31.21 ms
Chromium 8 8 47/47 382.92 ms 127.54 ms
Operation p50 Chromium Moli Delta Delta %
navigate 46.93 ms 7.01 ms −39.92 ms −85.07%
observe 1.69 ms 1.18 ms −0.51 ms −30.03%
fill 4.63 ms 4.31 ms −0.32 ms −6.97%
click 7.08 ms 6.48 ms −0.59 ms −8.38%
Idle-resource episode Peak RSS Peak PSS Average CPU Peak CPU Peak processes Sampler
Moli 65.84 MiB 64.06 MiB 0.85% 10.00% 1 ✅
Chromium 1096.12 MiB 345.81 MiB 2.37% 96.03% 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 18.95 ms 19.84 ms 700.00 KiB
Long-lived CDP session 13 0 18.02 ms 19.13 ms —
CDP smoke — ✅ 52/52 groups passed; 621 scenarios

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

Slowest group Scenarios Duration Status
scrollbar-visibility 22 28.55 s ✅
target-lifecycle 24 16.39 s ✅
dom-input 27 12.68 s ✅
chromium-cdp 56 11.64 s ✅
multi-page 45 10.75 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

Copy link
Copy Markdown
Contributor Author

Closing after the consolidation audit. This earlier rendered-state export stack was not part of the measured fixed build and is much broader than the evidenced Web Fetch defects. It is intentionally not merged into #1501.

@lanyue-llk lanyue-llk closed this Oct 13, 2026
@lanyue-llk lanyue-llk reopened this Oct 14, 2026
@lanyue-llk

Copy link
Copy Markdown
Contributor Author

Reopened after correcting the consolidation scope: this is an independent pre-existing stack and should not have been closed as part of #1501 cleanup. Its original scope and base relationship are preserved; this does not add it to #1501.

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