Skip to content

feat(script-sandbox): import map 裸说明符按页面映射解析,github home 404 清零 - #117

Merged
leizongmin merged 8 commits into
mainfrom
site-opt/20261008-github
Oct 11, 2026
Merged

leizongmin merged 8 commits into
mainfrom
site-opt/20261008-github

Conversation

@leizongmin

@leizongmin leizongmin commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

解决了什么

本 PR 按切片累积交付 github.com 打开链路的四个兼容性根修与交付工具改进。打开 github.com 曾出现四层问题,自上而下逐一根修:

1. import map:裸说明符映射

页面经 <script type="importmap"> 把 react、react-dom 等裸说明符映射到 githubassets 哈希 URL;ZeroWeb 之前不解析 import map,模块加载器把裸说明符按相对路径 join 成无效 URL,整组 404(home 一次加载 20+ 个),依赖这些模块的页面行为静默中止。

实现 WHATWG HTML import map 解析与全链挂钩:

  • script-sandbox 新增 import_map.rs:exact-key + trailing-slash 前缀键解析;未命中映射键保持原 resolve_document_url 路径(URL 形态零漂移)。ModuleRegistry 增 set_import_map(默认 None,无 map 时行为不变),在 specifier 解析单点挂钩,静态 import 与动态 import() 同按本代 map。
  • engine 新增 extract_import_map_json 提取页面 import map。
  • renderer:js_worker 快照换代重取 map(无 map/解析失败整张不注册,不跨页污染);模块执行、动态 import 回调、依赖收集消费同一 map;script_prefetch 预取队列的静态依赖展开同样先过映射(活体 404 波的最后一个未映射提交方)。
  • browser 侧 tab_js_worker / tab_scripts 同型挂钩。

2. 静态 import 提取器形态先验

github react-core(275KB webpack 产物)正文含 export const __webpack_modules__={…},其字符串内的 from \react-router/dom`被提取器整句裸扫from切成幻影依赖 → fetch 404 →__zw_compile_module` 返空 → "Loading chunk cmi failed after 3 retries"(切片 1 深化模块树后暴露,pricing 控制台异常的单一根因)。

修复:ImportClause/再导出形态先验——不合绑定子句形态的整句跳过(TC39 #sec-imports/#sec-exports),from 裸扫不再触达声明正文。5 个新单测(真实 react-core 形态最小复现红→绿、import/export 两侧幻影拒收、真实形态不误伤)。

3. 动态 import 编译回调接入页面 import map

react-partial 等经 webpack import("./"+t.u(e)) 运行时动态加载 chunk,该路径的编译回调此前不消费页面 import map,动态说明符裸键 join 404。修复后动态 import 回调与静态执行同按本代 map 解析(切片 1 的 ModuleRegistry 单点已就位,此处补回调侧消费)。

4. reset 路径 shim HTMLElement 桥重申 + Document ParentNode getters

exc1:ResetDocumentState 臂重放 shim 后,下一 SetDomSnapshot 跨代际全量 native install 无条件 global.set("HTMLElement") 覆盖 shim ctor 桥 → class X extends HTMLElement(turbo FrameElement、react-partial)经 polyfill _ceRunCtor 升级时 super() 落 native ctor、upgrade_node_id() 为空 → ctor 体字段落在被丢弃的构造产物 → Object.getPrototypeOf(undefined) TypeError 簇(t2e..t2g 四轮 beacon 裁决;tab_js_worker 持久 context 不触发)。

修复(共享路径):part03.js 桥块登记 globalThis.__zwShimHTMLElementCtor(同代唯一 closure 的桥函数对象锚点);js_worker SetDomSnapshot 臂跨代 install 后重申同一对象,_zwCeExisting 消费与 WC-M1 分支语义原样保留;reset 臂 shim 重放保留(4 个在库测试钉「reset 后世界可用」契约)。回归钉 renderer_js_worker_ce_upgrade_survives_cross_gen_native_install(真实 worker 命令环驱动 snapshot→reset→snapshot,自然红 left:"false" → 修复后绿)。同批:engine part49 钉 ce-vendors polyfillWrapFlushCallback 相容面(主/子 registry 双挂);part06.js 补 Document ParentNode 读侧四 getter(exc2:behaviors document.firstElementChild.classList TypeError,活体可见)。

5. 交付工具

delivery-check.mjs:draft 拒绝非附件 URL 的图片引用(2026-10-09 本 PR 对比表漏替换实测)、ready 阶段附件逐个探活(2xx + 图片魔数)、对比表图片行强制紧邻纯文字描述行;合并确认后删除远端 head 分支(串行 PR 复用时记录保留原因)。本 PR 截图按该门禁交付。

6. CE 升级一次性记账(P13)

exc1 修复后错误面前移一层:自定义元素注册表条目同 selector 重建时(页面动态再注册/同代重升级),升级路径无按实例的一次性标记——已升级元素被重跑构造器产出的空壳顶替(字段丢失),且 connectedCallback 内触发的再入升级形成递归环(2026-10-09 home 活体:5× RangeError Maximum call stack,栈形 _ceUpgradeSubtree → _ceUpgradeNode → connectedCallback → Proxy.get 自指,伴 2× Execution timeout + 1× Compile error)。

修复(规范路径,part03.js):升级一次性记账改为按元素实例 WeakMap(_ceUpgraded)——构造器执行前标记、重入直接返回原实例(对应 html.spec.whatwg.org/multipage/custom-elements.html「upgrade-a-custom-element」将元素标记为 upgraded 的语义);初始 attributeChangedCallback 与 connectedCallback 连接门按同源状态判定,不依赖构造产物替换;子树升级遍历预捕获 next,抗遍历中 DOM 变异。同 selector 重建空壳回归以真实 worker 命令环测试钉死(part29.rs:重建后实例字段完整、构造器恰好执行一次)。

返修(c446329b9,缺陷首轮 F1):初始 attributeChangedCallback 派发收口进升级原语 _ceRunCtor(walk/clone/R365/R366/createElement 六升级面统一覆盖,walk 面独立派发点移除避免双重派发)——base 的初始派发由非法构造器重放携带,P13 消灭重放后克隆/innerHTML 升级面曾丢失组件属性初始化回调(lit/stencil 依赖该路径);现符合「upgrade-a-custom-element」enqueue step 顺序(构造器→初始 attr→connected)。

7. 交付工具补充

p13fix 门禁组合子:matched-pair 同日构建对照(构建确定性:两次独立构建四二进制逐字节相同)、负载采样旁车(时序敏感捕获与 /proc/loadavg 同录)、官方捕获负载窗口约束——2026-10-10 实测共享机器负载峰值(load≈4.4-5.7)可在无修复与修复二进制上同现 P13 签名伪影(低负载重测两者皆干净),门禁捕获因此强制低负载窗口 + 负载留证。

怎么验证

  • 切片 1:github.com home 捕获的全部 83 个模块资产 83/83 编译通过(修复基线 12/18,6 个裸说明符失败资产全消除);无 map 时原有 12 个通过资产编译产物逐字节不变(零漂移)。活体 home 裸键 join fetch 20+ → 0、整页 0 个 4xx/5xx、0 exceptions;bodyTextLength 136302 前后逐字节相同。
  • 切片 2:真实 react-core 275KB 提取幻影 1→0;活体 pricing react-router/dom fetch failed 与 cmi 重试失败清零(见 pricing 对照表)。
  • 切片 3:react-partial chunk 动态加载按 map 命中,"chunk 加载失败"签名不再出现。
  • 切片 4:活体 home exc1 特征 TypeError 2 → 0(见 home 对照表);repo-vscode 0 exceptions / 0 consoleErrors / 0 requestFailed;pricing/home DOM 文本与基线逐字节同(93981 / 136302)。
  • 测试:新增 import map 解析/解析失败/预取映射判别单测、提取器形态单测、CE 跨代升级回归(真实 worker 命令环)、part49 兼容面钉。renderer 232、engine 2941(RUST_MIN_STACK=33554432)、script-sandbox 328、ce_ 166 全绿。
  • cargo fmt --check 0 diff;cargo clippy --workspace --all-targets -D warnings 通过;make test 8 腿(workspace 腿墙钟 900s→2700s 补跑,资源守卫参数非 oracle):A–G 全绿;leg H(quickjs renderer --lib)238/239——唯一失败 finish_page_load_fires_body_onload_r2946 为既存 main 侧 quickjs 组合缺口(判别实验:干净 HEAD 同败;同管线 r2941 过 → 故障面在 body-handler 反射的 quickjs 行为),非本切片回归,已记问题池独立修复。
  • 上游 WPT import-map 用例(testharness 形态)依赖 wpt-runner 页面宿主的 <script type=module> 加载面,该宿主尚未接模块加载,导入超出本切片边界;以等价本地单测覆盖,宿主接入列入后续测试面切片。

P13 切片补充:

  • 单测/回归:wc_m1_ce_upgrade_once_reentrancy(w1-w9:重入/重放/子树升级矩阵)+ renderer 回归钉(真实 worker 命令环 snapshot→重建→snapshot),修复前红(空壳实例)→ 修复后绿。
  • 活体门禁(matched-pair 同日同条件,低负载窗口):repo PNG 与无修复基线逐字节同(822abdf8 = 822abdf8)、home body 逐字节同(136302)且 0 异常、pricing 未完成态平价(P11 既有簇,本切片不主张修复);home PNG 同日 19:02 官方捕获与基线逐字节同(208bb76b),19:38 复测呈 github 首页 Three.js 球体动画帧相位差(DOM 仍逐字节同,已归因留档)。
  • 工程门禁:fmt 0 diff;workspace clippy -D warnings 通过;script-sandbox/engine/renderer/browser 定向测试腿全绿(browser 腿前预构建 dev 子进程二进制,与 Makefile test 同步骤)。
  • 披露:10-09 活体递归环今日在两种二进制下均不复现——github 服务端内容较 10-09 漂移(home readyState complete→loading 等,双稳定态切换已留档);本切片修复的直接证据由合成回归测试承载,matched-pair 像素对照证明零回归。
  • 返修验证(c446329b9):新增 wc_m1_ce_clone_initial_attr(未升级元素在升级点构造器+携带属性初始 attr 恰好一次、重走不重放;克隆腿同时钉定本引擎既有延迟升级时序——cloneNode 不同步构造,与 base 同源)与 test_document_parent_node_read_getters(TV-F3:Document ParentNode 读侧四 getter + classList 可达性,即 exc2 原生 TypeError 面)。zero-engine lib 2961 全绿;fmt 0 diff;workspace clippy -D warnings 通过;工程门禁六腿 + 目标门禁四检查在返修后 head 重跑全 PASS(候选 manifest r2 94226a32,捕获输出 p13fixp2-/p13fix2- 前缀,r1 官方证据封存不动;repo PNG 与锚点 822abdf8 仍逐字节同)。

还有什么问题

  • __zw_dispatch_link_event 路径 30s Execution timeout 签名:2026-10-10 晚 github 内容变体(react-core.3792 形态)下无修复与修复二进制同现,与页面内容双稳定态切换相关(当晚 18:05/19:25 稳定、19:0x 漂移,留档);shim 链接事件分发为何被阻塞 30s 根因待查(新问题池卡片)。
  • github 首页偶发自带 "Multiple instances of Three.js" console warning(页面自身双导入,type=warning 非 JS 异常;今晚捕获 1 条)。
  • home 83 个 modulepreload 提示的加载风暴拖慢渲染进程(P11,既存已知问题,非本 PR 引入)。
  • style 管线在 pricing/home 加载中出现 60s 级整核 CPU 停转(既存性能簇,r7 时代同形;切片 1 深化模块树后 pricing 总时长顶到 120s deadline,偶发 1× Execution timeout)。
  • 多张 import map 的规范合并(merge-existing-and-new-import-maps)未实现,当前取第一张合法 map(代码内 FIXME 标注)。
  • native createElement Rust 路径缺 _ceUpgraded/_ceConn 记账(缺陷首轮 F2,low):升级一次性不变式在该路径未闭合,与 base 同源非回归、重入环仍一步收敛;_ceUpgraded 为 shim IIFE 闭包局部量,Rust 侧无法直书(单测不可构造),已记问题池后续切片处理。
  • 动态 import 编译回调接线(js_worker/tab_js_worker 各 6 行)无 worker 层测试钉(测试有效性首轮 TV-F2,low):sandbox 层已有双向判别测试钉机制本身,接线回归风险由活体门禁承载,已记问题池。

优化前后截图

场景 1 / 检查点:github.com pricing 页首屏(800×600,headless,等待 150s——P11 饱和簇口径需要长等待窗)

优化前:ZeroWeb 优化后:ZeroWeb
提取器修复前:pricing 页文本完整渲染,但模块层存在幻影依赖(react-router/dom fetch failed + Loading chunk cmi failed after 3 retries×2) 返修后同条件:幻影依赖与 cmi 失败已在日志层清零(本 PR 证据),但页面落入既有 P11 modulepreload 饱和簇——同日 M₀ 同条件同为未完成态,该簇非本 PR 引入
优化前:github pricing 优化后:github pricing
  • 前图 / 后图版本:提取器修复前构建(9118481dd,2026-10-09 09:34 捕获)/ 返修后 c446329 r2 构建(2026-10-10 捕获)
  • 捕获条件:https://github.com/pricing ,等待 150s,viewport 800×600,headless,dark scheme
  • 观察到的变化及剩余差异:前图当时 pricing 可渲染但带幻影依赖异常(react-router/dom fetch failed + cmi×2),该异常已由本 PR 在日志层清零(见"怎么验证"切片 2);后图为返修后构建的 150s 帧——页面内容与导航结构已可见但样式未起(modulepreload 饱和簇挤压样式与模块处理,属既有 P11 开放簇,页面级恢复由 t-p11 下一切片承载。
  • 脱敏范围:公开 pricing 页渲染,无登录态/无隐私内容;证据日志不含凭据。

场景 2 / 检查点:github.com home 首屏(800×600,headless,等待 60s)

优化前:ZeroWeb 优化后:ZeroWeb
home 页文本完整渲染,但 CE 升级链断裂:turbo FrameElement 等自定义元素升级产出空字段实例,Object.getPrototypeOf(undefined) TypeError + document.firstElementChild.classList TypeError(exc1/exc2 根修对象) 同条件渲染一致;exc1/exc2 清零且 P13 递归环亦已修复(返修 c446329 后 exc=0)——DOM 文本 136302 字节前后逐字节同
优化前:github home 优化后:github home
  • 前图 / 后图版本:切片 1–3 修复后、exc1 修复前构建(921c79215,2026-10-09 12:21 捕获)/ P13 修复+返修后 r2 构建(c446329b9,2026-10-10 长等待 60s 捕获)
  • 捕获条件:https://github.com/ ,等待 60s,viewport 800×600,headless,dark scheme
  • 观察到的变化及剩余差异:后图 exc=0、requestFailed=0,DOM 文本 136302 与前图逐字节同;前图中的 exc1/exc2 TypeError 与 P13 RangeError 全部清零(P13 修复 + F1 返修后 r2 门禁 exc=0/ce=0/rf=0)。PNG 字节内容与前图不同(构建与修复面不同),页面文本层一致。
  • 脱敏范围:公开首页渲染,无登录态/无隐私内容;证据日志不含凭据。

场景 3 / 检查点:github.com home 首屏(800×600,headless,等待 60s——切片 1 模块层证据,2026-10-09 午前捕获)

优化前:ZeroWeb 优化后:ZeroWeb
home 页能正常渲染,但控制台有 20+ 个裸说明符 404(react 等被 join 成无效 URL),依赖模块加载静默中止——问题在网络层,图面看不出来 同条件渲染一致;裸键 404 波清零,react 等依赖全部按 import map 映射 URL 命中加载,模块依赖树深入到此前不可达的模块——两图像面相同是本修复的预期结果
优化前:github home 优化后:github home
  • 前图 / 后图版本:173bb91c0 工作区前身(js_worker 已挂 map、预取层未挂——裸键 404 波活跃)/ 返修后 c446329 r2 构建(2026-10-10 快速捕获 60s)
  • 捕获条件:https://github.com/ ,等待 60s,viewport 800×600,headless,dark scheme
  • 观察到的变化及剩余差异:两图像面无可见差异——本修复作用于网络与模块解析层,文本层逐字节一致(DOM 136302)是预期结果;修复的直接证据在网络日志(裸键 404 波 20+ → 0,映射 URL 全命中),像素图仅证明无渲染回归。
  • 脱敏范围:公开首页渲染,无登录态/无隐私内容;证据日志不含凭据。

场景 4 / 检查点:github.com home 首屏(800×600,headless,patient 口径等待 60s;P13 matched-pair 同日构建对照)

优化前:ZeroWeb 优化后:ZeroWeb
home 页正常渲染(无修复基线);P13 缺陷需同 selector 重建触发,当日活体首页不触发该路径,图面相同是预期 同条件渲染一致;PNG 与前图逐字节同(SHA-256 前缀 208bb76b),DOM 文本逐字节 136302
优化前:github home P13 对照 优化后:github home P13 对照
  • 前图 / 后图版本:无修复基线 6243f7f(10-10 matched-pair 独立重构建,17:2x 捕获)/ P13 修复+返修后 c446329 r2 构建(同日长等待 60s 捕获)
  • 捕获条件:https://github.com/ ,等待 60s,viewport 800×600,headless,dark scheme
  • 观察到的变化及剩余差异:两图 PNG 字节内容仍逐字节相同(SHA-256 前缀 208bb76b,返修后重捕获与前图同字节)——预期:修复作用于 CE 升级语义层,当日活体页面不触发同 selector 重建路径;直接证据为回归测试红→绿与零回归门禁(见"怎么验证"P13 补充)
  • 脱敏范围:公开首页渲染,无登录态/无隐私内容;证据日志不含凭据。

独立审查

环节 报告状态 head / base 证据
测试有效性首轮 PASS(历史报告) 64138d8 / 9296eb0 本地证据 SHA-256:df54b50151810d053681ba765e7cb62e70fafff425b7caadae10a7234ffb45e1
缺陷首轮 PASS(历史报告) 64138d8 / 9296eb0 本地证据 SHA-256:6c8e5d81886f92d45f3ddf33d72a1dcc99b6cd24b842290f2a75824902eea3c0
缺陷复核 PASS c446329 / 9296eb0 本地证据 SHA-256:a4745c5fa74fa540841d4f0cb51991a2587e86ac91f2e0393319a9bcb6aaec54
汇总 PASS c446329 / 9296eb0 本地证据 SHA-256:4ad5300a2f9a5733635f2779dd32022a72ae4aea962cff278fc4bcb944c685c6

未解决阻断项:0。
报告保留在本地运行目录;以上为报告记录,独立性与交付就绪另由门禁核验。

各报告要点:

  • 测试有效性首轮(独立上下文,head 64138d8):PASS——4 组行为破坏核对全部有效(退回旧实现两测即红、tag-key 记账替身呈空壳签名、exc1 renderer 钉删重申即红、提取器守卫置空两侧转红),head 态全绿;4 条 open findings(TV-F3 medium:exc2 Document ParentNode 四 getter 无测试钉;TV-F1/F2 low;TV-F4 info)。
  • 缺陷首轮(独立上下文,head 64138d8):PASS——F1 medium(初始 attr 派发随重放消灭而丢失)与 F2 low(native 路径记账未闭合,非回归)各附触发条件与 spec 依据。
  • 统一返修(c446329b9):F1 已修复 + TV-F3 补钉(见上文返修段);F2/TV-F2 deferred 并披露;TV-F1(沙箱结构性限制,活体门禁承载)/TV-F4(既有提交信息计数出入)无代码动作。
  • 非作者定向复核(独立上下文,head c446329):PASS——10 checks 全过,含六升级面覆盖核对、无双重派发证明、变异自查(删初始派发调用→克隆钉精确转红→还原后 5/5 复绿);2 条 info(RC-F1 clippy 日志证明力弱——已由工程门禁 r2 在新 head 重跑收敛;RC-F2 引擎克隆延迟升级为相对 spec 的既有偏差,注释已如实框定)。

🤖 Generated with Claude Code


Note

Medium Risk
Changes module resolution and custom-element upgrade semantics on hot paths (renderer/browser JS workers and DOM shim); regressions could break real sites like github.com, though coverage is heavy. Delivery script changes only affect optimizer PR workflow.

Overview
Adds WHATWG import map support end-to-end so bare module specifiers (e.g. react) resolve via page <script type="importmap"> during prefetch, static module compile, and dynamic import()—including new import_map.rs, HTML extraction, and worker snapshot wiring in browser/renderer.

Tightens ES module static-import extraction with import/re-export clause shape guards so webpack bundle strings are not mistaken for dependencies (fixes phantom from matches).

Fixes github.com-style custom elements issues: shim polyfillWrapFlushCallback, re-assert shim HTMLElement after cross-navigation native install, P13 per-instance upgrade-once (_ceUpgraded) with initial attributeChangedCallback in the upgrade path, and Document ParentNode read getters (firstElementChild, etc.).

Site-optimizer delivery gates now require GitHub attachment URLs in draft, probe attachments at ready, caption rows above screenshot tables, and record post-merge remote branch deletion on merge receipts.

Reviewed by Cursor Bugbot for commit c446329. Bugbot is set up for automated code reviews on this repo. Configure here.

leizongmin added a commit that referenced this pull request Oct 10, 2026
PR 正文图片引用此前无机械校验,PR #117 对比表残留运行目录相对路径漏发布
(附件 URL 被另起一行挂在页脚后)。fix:
- checkBody 拒绝非附件 URL 的 ![…] 引用(draft 阶段即拦本地/相对路径;
  围栏代码块内的示例不拦截)
- ready 门禁对每个附件 URL 逐个探活(GET 首块字节,2xx + 图片魔数/类型,
  15s 超时,无凭据);verifyPresentation 增加可注入探针供离线测试
- 合并回执新增 head_branch/branch_deleted(保留须记 branch_kept_reason,
  待分支最后一个 PR 合并时删除);verify-delivery 拒绝缺失记录的合并回执,
  历史回执走 legacy 放行
- github-delivery.md/workflow.md 同步契约与回执字段说明

验证:scripts 117/117 测试通过(含 3 个新增用例:本地路径拒绝、探活拒绝、
探活魔数判定);lei-pre-commit-guard PASS(6 文件 +96/-7,0 发现)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
leizongmin added a commit that referenced this pull request Oct 10, 2026
PR description 的前后对比表只有图片时读者难以理解差异(用户 2026-10-09 反馈:
光看图不容易看明白)。模板与交付契约要求每个图片行紧邻上方有一行纯文字描述
(前/后列各一句,两图相同时说明为何相同是预期);检查器在配对核验中机械校验
该行存在(两格非空、无图片引用、非表头/分隔行),缺失即拒绝。

PR #117 正文已同步加描述行;脚本测试 118 全绿(新增缺失/错位/嵌图/空格四变体)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@leizongmin
leizongmin force-pushed the site-opt/20261008-github branch 2 times, most recently from fa7e546 to a2479f7 Compare October 10, 2026 04:57
leizongmin added a commit that referenced this pull request Oct 10, 2026
PR 正文图片引用此前无机械校验,PR #117 对比表残留运行目录相对路径漏发布
(附件 URL 被另起一行挂在页脚后)。fix:
- checkBody 拒绝非附件 URL 的 ![…] 引用(draft 阶段即拦本地/相对路径;
  围栏代码块内的示例不拦截)
- ready 门禁对每个附件 URL 逐个探活(GET 首块字节,2xx + 图片魔数/类型,
  15s 超时,无凭据);verifyPresentation 增加可注入探针供离线测试
- 合并回执新增 head_branch/branch_deleted(保留须记 branch_kept_reason,
  待分支最后一个 PR 合并时删除);verify-delivery 拒绝缺失记录的合并回执,
  历史回执走 legacy 放行
- github-delivery.md/workflow.md 同步契约与回执字段说明

验证:scripts 117/117 测试通过(含 3 个新增用例:本地路径拒绝、探活拒绝、
探活魔数判定);lei-pre-commit-guard PASS(6 文件 +96/-7,0 发现)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
leizongmin added a commit that referenced this pull request Oct 10, 2026
PR description 的前后对比表只有图片时读者难以理解差异(用户 2026-10-09 反馈:
光看图不容易看明白)。模板与交付契约要求每个图片行紧邻上方有一行纯文字描述
(前/后列各一句,两图相同时说明为何相同是预期);检查器在配对核验中机械校验
该行存在(两格非空、无图片引用、非表头/分隔行),缺失即拒绝。

PR #117 正文已同步加描述行;脚本测试 118 全绿(新增缺失/错位/嵌图/空格四变体)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
leizongmin and others added 6 commits October 10, 2026 12:58
实现 WHATWG HTML import map 解析(exact-key + trailing-slash 前缀键;未命中保持
resolve_document_url 原路径,URL 形态零漂移),并挂钩模块解析全链:

- script-sandbox 新增 import_map.rs(parse_from_page/resolve/resolve_mapped,规范锚
  注释 + 单测);ModuleRegistry::set_import_map(默认 None,零行为变化);
  resolve_registered_specifier 单点挂钩 transform_import 全形态,静态/动态 import
  同按本代 map
- engine 新增 extract_import_map_json,从页面 HTML 提取 `<script type="importmap">`
- renderer:js_worker SetDomSnapshot 每代重取 map(无 map/解析失败整张不注册,不跨页
  污染),ExecuteModule、动态 import 回调、collect_module_deps 消费;script_prefetch
  静态依赖展开同样先过 resolve_mapped(修复活体裸键 404 波的最后一个 mapless 提交方);
  page_scripts 预取路径同型
- browser:tab_js_worker 三消费点 + tab_scripts 快照预取路径同型挂钩

验证:
- 离线编译探针:github.com 捕获的全部 83 个模块资产 83/83 编译 OK(基线 12/18,6 个
  裸说明符 ERR 资产全消除);无 map 时 12 个原 OK 资产编译产物逐字节不变(零漂移)
- 活体 github.com home:裸键 join fetch 0(修复前 20+ 个 404,react 等 6 键全命中
  映射 URL)、全日志 0 个 4xx/5xx、0 exceptions、bodyTextLength 136302 与基线逐字节
  相同;repo-vscode 0 异常/0 requestFailed
- 测试:新增 import map 单测与 renderer 预取映射判别测试;renderer 231、
  script-sandbox 314+10、engine 2937(1 例深嵌套栈溢出为既存环境失败,stash 后
  clean HEAD 同败)、integration 785、browser 焦点套件 5/6(1 例既存失败,clean
  HEAD 同败)
- cargo fmt --check 无 diff;cargo clippy --workspace --all-targets -D warnings 通过

Co-Authored-By: Claude Code <noreply@anthropic.com>
PR 正文图片引用此前无机械校验,PR #117 对比表残留运行目录相对路径漏发布
(附件 URL 被另起一行挂在页脚后)。fix:
- checkBody 拒绝非附件 URL 的 ![…] 引用(draft 阶段即拦本地/相对路径;
  围栏代码块内的示例不拦截)
- ready 门禁对每个附件 URL 逐个探活(GET 首块字节,2xx + 图片魔数/类型,
  15s 超时,无凭据);verifyPresentation 增加可注入探针供离线测试
- 合并回执新增 head_branch/branch_deleted(保留须记 branch_kept_reason,
  待分支最后一个 PR 合并时删除);verify-delivery 拒绝缺失记录的合并回执,
  历史回执走 legacy 放行
- github-delivery.md/workflow.md 同步契约与回执字段说明

验证:scripts 117/117 测试通过(含 3 个新增用例:本地路径拒绝、探活拒绝、
探活魔数判定);lei-pre-commit-guard PASS(6 文件 +96/-7,0 发现)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
react-core(pricing cmi chunk)正文含 react-router 开发警告字符串,`export const
__webpack_modules__={…}` 巨型声明整包进 split_from_clause 裸扫,串内
`from \`react-router/dom\`` 被切成幻影静态依赖:collect_module_deps fetch 404 →
__zw_compile_module 返空 → 模块 "Module not found" → 站点 chunk 三连重试报
`Loading chunk cmi failed`;prefetch 层同幻影另发 `script fetch failed`。
r7 不触发(模块树止步裸键 404,react-core 从未编译);P6 深化加载后暴露。
Chrome 不切字符串内 import 文本故 0 异常。

修复:按 ECMA-262 ImportClause/#sec-exports 先验语句形态——import 子句仅
`{`/`*`/引号/IDENT+from|`,`,再导出仅 `{`/`*`;不合形态整句跳过,from 裸扫不再
触达声明正文(合法绑定子句无字符串词法形态)。

验证:
- 红态探针:真实 react-core 275KB 提取恰 `["react-router/dom"]`;修复后 0
- 新增 5 单测:react-core 形态最小复现、import/export 两侧幻影拒收、默认/组合/
  命名空间/字符串/压缩真实形态不误伤
- sandbox 319P / renderer 231P / browser bin 483P(5 失败经 stash 循环确证既有,
  非本轮引入);fmt/clippy 全绿,见任务证据 gate-rust-quality-p6b.log
- 本修复后 pricing 活体仍余 5 个 react-partial chunk 失败(Module not found:
  react),根因为动态 import 路径漏接页面 import map,由后续提交修复

Co-Authored-By: Claude Code <noreply@anthropic.com>
github lazy chunk(chunk-lazy-react-partial-*-<hash>.js)静态 import 裸说明符
(`import*as r from"react"`),依赖 github 页面 import map 解析。P6 只给静态入口
路径(execute_module_in_sandbox)接了 map;动态 import 的 __zw_compile_module
回调自建 ModuleRegistry 未接——transform_import → resolve_registered_specifier
的 map 阶段 miss → registry.get("react") 失败 → "Module not found: react" →
回调吞为空串 → __zw_load_module 抛错 → 站点 Rspack 重试 3 次报 Loading chunk
failed。pricing 5 个 react-partial chunk 全部此根因(其静态 import 为裸说明符;
共享 chunk 经静态图编译不受影响)。Chrome 用原生 import map 故正常。

离线端到端复现(replica 探针:真实 chunk + github 页面 map,逐镜像回调链):
fetch ×8 ✓ → collect ✓ → compile FAIL "Module not found: react";接 map 后
5/5 chunk compile ok(kq9/u2l/7gn/xy/jdp)。

修复:renderer js_worker 与 browser tab_js_worker(同源拷贝)的编译回调
registry 统一 set_import_map(镜像静态路径的 P6 接线位)。

验证:
- replica 5/5 chunk PASS(离线端到端)
- script-sandbox 新增 compile 级回归测试:无 map 判别失败(错误点名裸说明符)
  + 有 map 内联成功(test_compile_dependency_iife_resolves_bare_specifier_
  via_import_map)
- sandbox 319P / renderer 231P / browser bin 483P(5 失败经 stash 循环确证既有,
  非本轮引入);fmt/clippy 全绿,见任务证据 gate-rust-quality-p6b.log
- 活体 pricing/home 复测见任务证据(t2n 轮)

Co-Authored-By: Claude Code <noreply@anthropic.com>
PR description 的前后对比表只有图片时读者难以理解差异(用户 2026-10-09 反馈:
光看图不容易看明白)。模板与交付契约要求每个图片行紧邻上方有一行纯文字描述
(前/后列各一句,两图相同时说明为何相同是预期);检查器在配对核验中机械校验
该行存在(两格非空、无图片引用、非表头/分隔行),缺失即拒绝。

PR #117 正文已同步加描述行;脚本测试 118 全绿(新增缺失/错位/嵌图/空格四变体)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
reset 路径反转 R384「生产态 shim 后装」安装序:ResetDocumentState 臂重放 shim
后,下一 SetDomSnapshot 跨代际全量 native install 无条件
global.set("HTMLElement") 覆盖 shim ctor 桥。此后 class X extends HTMLElement
(github turbo FrameElement、react-partial)经 polyfill _ceRunCtor 升级时
super() 落 native ctor:upgrade_node_id() 为空 → this 绑到新建的 detached div,
ctor 体字段落在被丢弃的构造产物上 → createElement 产物仅原型正确,读 delegate
即 Object.getPrototypeOf(undefined) TypeError(t2e..t2g 四轮 beacon 裁决;
tab_js_worker 持久 context 不触发,不受影响)。

修复(共享路径,通用机制):part03.js 桥块登记
globalThis.__zwShimHTMLElementCtor(同代唯一 closure 的桥函数对象锚点);
js_worker SetDomSnapshot 臂在跨代 install 之后重申同一对象——_zwCeExisting
消费与 WC-M1 分支语义原样保留。reset 臂 shim 重放保留(4 个在库测试钉
「reset 后世界可用」契约,__zw_begin_script 由 shim 提供);不可用二次 eval
整体补装(customElements 存在守卫产生 closure 割裂)。

测试:js_worker 新增 renderer_js_worker_ce_upgrade_survives_cross_gen_native_install
(真实 worker 命令环驱动 snapshot→reset→snapshot,define + createElement 断
ctor 体 own property;自然红 left:"false" → 修复后绿);engine part49 钉
ce-vendors polyfillWrapFlushCallback 相容面(主/子 registry 双挂)。同批带上:
part06.js Document ParentNode 读侧四 getter(exc2:behaviors
document.firstElementChild.classList TypeError)、bridge_tests 注册 part49。

活体验证(t2n,19:58:03 release 二进制):home exc1 特征 0(基线 2)、
repo-vscode 0 exceptions/consoleErrors/requestFailed、DOM 文本与基线逐字节同
(136302);错误面前移一层为 connectedCallback 递归环(P13,另切片)。

门禁:fmt 0 diff;clippy --workspace --all-targets -D warnings exit 0;renderer
lib 241(含 main 侧新钉)/ engine 2973 / ce_ 166 全绿;git diff --check 净。
make test 8 腿(workspace 腿 900s→2700s 墙钟补跑,资源守卫参数非 oracle):
A–G 全绿;leg H(quickjs renderer --lib)238/239——唯一失败
finish_page_load_fires_body_onload_r2946 为既存 main 侧 quickjs 组合缺口(判别
实验:stash 暂存后干净 HEAD 同败 30.26s vs 30.27s;同管线 r2941 过 → 故障面在
body-handler 反射的 quickjs 行为),非本切片回归,已记问题池 P14 另切片修复。
注:本机 harness shell 缺 ~/.profile 的 BINDGEN_EXTRA_CLANG_ARGS(rquickjs-sys
bindgen 资源头目录),workspace 级 clippy/test 需显式 export,机器级缺口为
libclang-common-18-dev 未装、无 sudo 修复。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@leizongmin
leizongmin force-pushed the site-opt/20261008-github branch from a2479f7 to 6243f7f Compare October 10, 2026 04:58
leizongmin and others added 2 commits October 10, 2026 17:06
首版 key 记账(_ceUpgraded[sel-key])在 proxy 缓存失效(导航清空、R52 移除清理)
后重建的同 sel 元素被永久跳过升级——无原型无 ctor 空壳,github repo 页动态 apply
常态触发 hydration 中断(Execution timeout 30000ms 簇)。改为 WeakMap 按元素对象
身份记账:不触 proxy trap、无跨元素键碰撞、可 GC;升级一次性语义不变(define 重走
/upgrade 重走/innerHTML attach 不重放 ctor),重建 proxy 正常重放升级(与无修复
HEAD 行为一致且重放面严格更小)。

测试:wc_m1_ce_upgrade_once_reentrancy 扩至 w1-w9(重走不重放/define 前已连补派/
reentrancy 环一步收敛/re-connect 重派/同 tag 多实例逐实例升级);wc_m1_ce_customized_
builtins 预期更新为钉死 D/F define 全文档重走不重放已升级元素(旧预期含两组重放
序列,即本修复针对的回归形态)。zero-engine lib 2959 通过 0 失败;fmt、workspace
clippy -D warnings 通过。

Co-Authored-By: Claude Code <noreply@anthropic.com>
PR #117 双审查返修:base 的初始 attributeChangedCallback 派发由非法 ctor 重放
携带;P13 一次性记账消灭重放后,克隆/innerHTML 升级面丢失组件属性初始化回调
(lit/stencil 依赖该路径)。将初始派发收口进升级原语 _ceRunCtor(walk/clone/
R365/R366/createElement 六调用点统一覆盖),spec「upgrade a custom element」
enqueue step 顺序 ctor→attr;walk 面独立派发点移除,避免双重派发。

新增测试钉:wc_m1_ce_clone_initial_attr(未升级元素在升级点 ctor+携带属性
初始 attr 恰好一次、重走不重放;克隆腿同时钉定本引擎既有延迟升级时序)与
test_document_parent_node_read_getters(TV-F3:Document ParentNode 读侧四
getter + classList 可达性)。zero-engine lib 2961 测试全绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
@leizongmin
leizongmin marked this pull request as ready for review October 11, 2026 02:29
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 3d6904cf-b231-4204-a19d-e08704d71720)

@leizongmin
leizongmin merged commit 7cf2ec0 into main Oct 11, 2026
3 checks passed
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