Skip to content

[PR] fix(#5219): bound the bounded-boot parse window by decoded-file count - #5634

Open
ranxianglei wants to merge 4 commits into
masterfrom
2026-11-04_bounded-boot-warm-window
Open

ranxianglei wants to merge 4 commits into
masterfrom
2026-11-04_bounded-boot-warm-window

Conversation

@ranxianglei

Copy link
Copy Markdown
Owner

Fixes #5219

What breaks

dsh-launcher report ("service crashed, sessions exploded instantly"): every cold start hangs pre-listen, exceeds the launcher's 60s health budget, gets killed without confirmed death, and the surviving child's index.db write lock poisons the next spawn — a spawn-kill loop ending in fatal load failure. Reporter's v0.1.209 log: each boot logs ONLY the storage-init line and never reaches [persist] indexed N state files.

Root cause

The bounded-boot parse window (SessionStore.bootBounded, src/persist.ts) stops when candidates >= maxSessions AND bytes >= maxBytes. When NEITHER term binds, the loop degenerates:

  • maxSessions = 0 is the DEFAULT (sessionWarmMax()): the count stop-term is vacuously true, so the loop decodes the WHOLE corpus synchronously pre-listen until the 64 MiB byte budget — then pops every candidate in the savedAt-desc trim anyway (nothing survives at warm=0). Pure wasted work, scaling with corpus size.
  • even with maxSessions > 0, a corpus of many small files fills the byte budget one file at a time — same unbounded decode count.

The reporter's store went from 0 files to hang-inducing within ~3.5h of use; every cold start since exceeded the health budget.

Fix

Cap the window by DECODED-FILE COUNT, alongside the existing count/bytes terms:

Files past the cap stay lazy-loadable through loadSync; nothing on disk is touched or deleted. The legacy (non-unified) branch keeps its deliberate synchronous full parse — documented residual boundary.

Behavior change (disclosed)

  • Default-config boot (sessionWarmMax() = 0): warmed set UNCHANGED (empty before, empty after); pre-listen synchronous decode work goes from "whole corpus up to 64 MiB" to ZERO. Boot latency on large stores drops from minutes to ~0; no data-path change.
  • Bounded boot with maxSessions > 0 on corpora LARGER than the cap: warm-set arbitration now sees the newest-by-mtime cap files instead of the whole corpus; a file whose savedAt outranks its mtime position past the cap degrades from warmed to lazy-on-demand (availability kept, warmth lost in a corner case). Corpora below the cap (every normal install) behave identically.

Config surface

None — internal guard constants only; no new env/config/CLI fields.

Tests

  • New gate tests/issue5219-bounded-boot-decode-cap.test.ts: three deterministic cases — degenerate config (old code: 100 pre-listen decodes → RED; fixed: <10), capped corpus (old: 70 → RED; fixed: 64–69), small-corpus control (10 == 10 on both sides, pins no behavior change when the cap doesn't bind).
  • Targeted suites green locally on the rebased head: issue5219 gate + bounded-storage + bounded-storage-scale (15/15); issue3199-overview-cold-scan + storage-full-flip + knobs-config-precedence + persist-guard-ownership + persist-metadata-fold-gate (40/40). Full-suite verdict = remote CI lanes.

Related: #3199 (window origin), #404 (warm semantics), #2803 (decoded-byte budget), #4539/#4515 (earlier orphaned attempt), #5294 (companion second-writer fix, already shipped in v0.1.210+).

The #3199 parse window stops when candidates >= maxSessions AND bytes >=
maxBytes. When neither term binds — maxSessions=0 (the sessionWarmMax()
default) or many small files under a large byte budget — the loop decoded
the WHOLE corpus synchronously pre-listen, then popped every candidate in
the savedAt-desc trim anyway. On a store that grows to thousands of files
this exceeds the dsh launcher's 60s health budget; the hung child keeps
the index.db write lock, the launcher kills without confirmed death, and
the next spawn poisons off the lock — the #5219 spawn-kill loop.

Decode attempts are now capped: 0 when nothing survives the trim (the
default config), otherwise min(2048, max(64, 16*maxSessions)) so normal
corpora never hit it (the byte budget stops first there). Files past the
cap stay lazy-loadable through loadSync; their alias bookkeeping lands in
scanRemainderInBackground, which already owns the out-of-window files.
Warm-set semantics are unchanged in every case where the cap does not
bind; at maxSessions=0 the warmed set was empty before and after, so only
the wasted pre-listen work moves to post-listen.

Gate: tests/issue5219-bounded-boot-decode-cap.test.ts (red on the old
loop: 100/70 decodes pre-listen; green with the cap).
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

📦 Built Package Artifact

Branch: 2026-11-04_bounded-boot-warm-window (26dd852)

Latest build — install this exact version

npm install -g billion-context@0.0.9317-pr.5634.6db358e

This exact version is immutable and reproducible. The rolling pr tag tracks the newest test build across all PRs.

Recent builds (commit → version)

commit version build
26dd852 billion-context@0.0.9317-pr.5634.6db358e build
4c018c1 billion-context@0.0.8079-pr.5634.9d11b19 build
df6ae82 billion-context@0.0.8076-pr.5634.72b25ff build
77b769d billion-context@0.0.8069-pr.5634.9998bfd build

Download artifact

  1. Download the artifact from the Actions run
  2. Extract the tarball and install:
tar xzf billion-context-pr5634.tgz
npm install -g package

Install instructions are refreshed on each push.

@ranxianglei ranxianglei changed the title fix(#5219): bound the bounded-boot parse window by decoded-file count [PR] fix(#5219): bound the bounded-boot parse window by decoded-file count Nov 4, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

查重结论:不重复。同机制族最近的前置工作是 #4515(boot 全量扫描历史语料撞 60s 冷启动预算)及其 Slice-1 PR #4539——两者均 closed 未合并(孤儿尝试);本 PR 完成同一方向并 supersede 它们。无其他 open issue/PR 触碰 bootBounded 解析窗口;分叉点后 master 前进的 4 个提交(#5629 kernel + golden 再生)与本 diff 文件(src/persist.ts + 新增测试)零交集。

标签:bug / dsh / scope/storage / p1(dsh launcher 确定性 spawn-kill 循环、用户不可用;根因在会话存储 boot 解析路径——原 issue #5219 的 triage 标签 scope/wiring 按已确认根因应为 scope/storage)。

代码审查(diff 逐行 + 既有行为回归清点 + 测试有效性)已完成,要点:

  • 根因核实成立:旧窗口停止条件在 maxSessions=0(默认)时计数项恒真、只剩字节预算一项,循环同步解码整个语料后又在 savedAt-desc trim 里全部弹出——纯浪费且随语料规模增长;decoded-file-count 上限(0 / min(2048, max(64, 16×maxSessions)))精确堵住两个退化方向。
  • 越界文件的别名/正典记账由既有的 seedIndexedAliases(索引行、免解码、pre-listen)+ scanRemainderInBackground(post-listen、逐文件让出事件循环)覆盖,与 Web UI first paint stalls 78-180s+: /__bili/overview cold scan blocks the event loop, and the freeze itself feeds the respawn churn #3199 延迟契约一致;legacyAliases 的消费点(warm 水合、loadSync)在统一模式下有索引种子兜底,无新回归面。
  • legacy(非统一)分支保持原有意同步全量解析,PR 已披露为残余边界。
  • 行为变更披露完整(默认配置 pre-listen 解码 全语料→0;超大语料下 warm-set 仲裁面收窄到 mtime 最新 cap 个文件)。

head 77b769da60 的 CI test 车道(ubuntu/windows × node22/24 × shards)仍在跑,判定以远程 CI 为准。CI 结果出来后补结构化八问结论。

@ranxianglei ranxianglei added bug Something isn't working dsh p1 scope/storage labels Nov 4, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

PR #5634 review 结论(独立重做:新旧代码逐行、v0.1.209 标签核实、既有行为逐项清点、配置默认值与唯一调用点验证)

① 是什么问题:统一存储模式下默认配置的冷启动在 listen 前同步解码整个会话语料(直到 64 MiB 字节预算),事件循环被堵死 → dsh launcher 60s 健康预算耗尽 → spawn-kill 循环 → 孤儿子进程持有 index.db 写锁毒化下一次启动 → fatal load failure,用户不可用。

② 什么原因导致的:bootBounded(src/persist.ts)解析窗口的停止条件是 candidates ≥ maxSessions AND bytes ≥ maxBytes。maxSessions = sessionWarmMax() 默认为 0(src/knobs.ts:419-424 已核实),计数项恒真,只剩字节预算一项 → 循环同步解码全语料,随后 savedAt-desc trim(while (parsedCands.length > maxSessions || ...) pop())在 warm=0 下把候选全部弹出——纯浪费且随语料规模线性增长;maxSessions>0 时大量小文件同样逐个填满字节预算,同一退化形状。版本核实:v0.1.209 标签上该循环逐字存在(src/persist.ts:789),机制非 master 漂移、非版本错读。因果链:同步解码堵事件循环 → 健康探针超时(探针本身需要事件循环)→ kill 未确认死亡 → 写锁残留。

③ 影响范围与严重程度:p1,用户不可用。触发条件:unified 存储(shadow/full)+ warm 配置使窗口退化(默认即命中)+ 语料大到 pre-listen 解码超过健康预算余量。报告者 store ~3.5h 使用量即命中;小语料用户无感(解码快)。legacy(非统一)分支不受本修复覆盖——有意保留的残余边界(见⑤)。

④ 怎么修复的:给窗口加第三个停止项——已解码文件数上限:maxSessions===0 → 0(trim 后无一存活,解码全是浪费);否则 min(2048, max(64, 16×maxSessions))(具名常量 BOOT_WINDOW_DECODES_PER_SESSION/MIN/MAX)。越界文件保持 loadSync 懒加载可用;别名/正典记账回落到 #3199 既有延迟契约:seedIndexedAliases(索引行、免解码、pre-listen)+ scanRemainderInBackground(post-listen、每文件 setImmediate 让出事件循环)。我额外核对了 legacyAliases 的全部消费点(warm 水合 L1022、loadSync 解析 L1508):统一模式下索引种子在 listen 前即覆盖有索引行的会话,背景扫描只是兜底——无新增暴露面。修的是产生缺陷的机制(窗口停止条件不完备),不是症状遮蔽。

⑤ 是否有回归问题:diff 触碰路径的既有行为逐项清点——

  • 默认配置 warmed set:之前空(trim 清空)、之后空,不变;pre-listen 同步解码工作从「全语料 ≤64MiB」→ 0。大 store 启动延迟从分钟级降到 ~0。PR 已披露,判定为有意变更且正确。
  • maxSessions>0 且语料小于 cap:行为逐字节不变(gate 测试 case 3 钉死恰好 10==10 次解码)。
  • 语料大于 cap:warm-set 仲裁面从全语料收窄到 mtime 最新 cap 个文件;savedAt 更新但 mtime 排位越过 cap 的文件从 warmed 降为 lazy-on-demand——可用性保住、角落场景失温。PR 已披露,可接受(懒加载是 Bound startup session loading and preserve historical recovery #2803 的一等路径)。
  • legacy 分支:保持原有意同步全量解析,diff 未触碰,披露为残余边界(非统一模式大语料仍会慢启动——这是 Web UI first paint stalls 78-180s+: /__bili/overview cold scan blocks the event loop, and the freeze itself feeds the respawn churn #3199 的既有边界,不是本 PR 引入的回归;是否要治属后续决策,不在本 PR 范围)。
  • fail-fast 语义:非法 limits 仍 throw;读失败文件计入尝试次数(cap 保守消耗);损坏文件隔离路径(quarantineCorruptState)未触碰。
  • 无其他阈值/时序/输出格式漂移。结论:无意回归 0 处;两处有意变更均已按规范披露。

⑥ 是否破坏缓存:不涉及。boot warm set 只影响内存驻留与首次触达延迟;模型线 prefix cache、压缩状态、去重键、wire 内容均未触碰。

⑦ 是否改了设计方向:没有。完全留在 #3199「窗口 + 延迟」架构内,只是让窗口在两个停止项都不绑定时也遵守自己的契约。

⑧ 是否引入新配置:没有。仅三个内部守护常量,无 env/config/CLI 面(PR 的 Config surface 声明属实,已独立核实)。

测试有效性:gate 三个 case 都有牙——退化配置(旧码 100 次 pre-listen 解码 → RED,修后 <10)、capped 语料 70 文件/maxSessions=4(旧 70 → RED,修后 64≤n<70)、小语料对照(恰好 10==10,钉住 cap 不绑定时零行为变化)。计数走实例级 readRawFileWithBytes spy 测真实调用,边界对背景扫描 straggler 留了校准余量且与旧行为(100/70)差距足够宽,不会 flake 成假绿;另断言越界文件仍可 loadSync(可用性优先)。该 bug 回归时抓得住。

diff 整洁度:单 commit、2 文件、+164(21 src / 143 test),每行都为目的服务;无空白噪音、无跑题文件。代码质量达标:具名常量、注释讲机制与出处(# 引用齐全)、风格与周边一致。

CI 状态(合并前置):head 77b769da60 的 test matrix(ubuntu/windows × node22/24 × shards)+ static-gates 于 ~02:38 UTC 被 cancelled,无判定(red-signal 哨兵同批取消);guard 车道已过(kernel-guard / lock-sync / lifecycle-ledger-guard / docs-coverage / test-import-graph / plan success),另有 6 个 guard job 排队中,镜像缓存未见重跑。合并前需把 test 车道重跑到绿(我这边无法触发重跑,token 无 actions 权限;master 自 base 前进的 4 个提交为 #5629 kernel+golden,与本 diff 零交集,无需 rebase)。

判定:代码审查通过——根因定位到机制层、修法最小且尊重既有延迟契约、行为变更完整披露、测试有牙、diff 干净。待 CI 重跑绿即可合(原 issue 已挂「马上合并」,建议重跑后直接放行)。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

补充:CI 状态同步(代码结论不变)。

发生了什么:第一遍 synchronize 运行里,test 矩阵中途被取消(约 02:38Z),没有留下任何结论;最终跑完的只有 12 个 guard 车道(kernel-guard / lock-sync / version-guard / config-surface-guard / docs-sync / docs-coverage / lane-guard / pi-subagents-guard / unused-exports / lifecycle-ledger-guard / test-import-graph / plan,全绿)。也就是说:全量测试的裁决目前还不存在,不能直接合。

我做了什么(只动 PR 分支,零代码改动、零冲突):

  1. 并入 ci-fixes 哨兵分支(CI Control Center: Centralized CI Failure Handling & Status Sync (Comment all CI issues here; do not open new issues) | CI 总控: CI 失败集中处理与状态同步(所有 CI 问题在此评论, 勿开新 issue) #4599 惯例)——带一个 win32 abort-teardown 预算的 CI 稳定修复(tests/wire-exit-matrix.test.ts,+13/-3);
  2. 并入当前 master 23a826d37——原 PR base(1b7a661a2)落后 4 个提交([PR] Fix #5618 usage wall: remote-URL / file-ref media becomes foldable, its re-access handles ride the summary #5629 kernel ref-recoverable-media 及 golden 再生),与本 PR 文件零交集。

新 head 4c018c1cc:与 master 的树差恰好 = 本 PR 两个文件 + 上述 CI 稳定修复。push 已触发新一轮 synchronize 全量矩阵,等它出裁决。

判定不变:代码审核通过(见上一条八问);CI 转绿后即可合并。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

CI 裁决出来了:全绿,可以合并。

同步后的 head 4c018c1cc 上,新一轮 synchronize 矩阵已全部完成、零失败:

  • test 矩阵 12/12 腿通过(ubuntu-latest node22/24 × shard 1-3,windows-latest node22 × shard 1-5);
  • static-gates(ubuntu + windows)通过;
  • 其余 guard 车道(kernel-guard / lock-sync / version-guard / config-surface-guard / docs-* / lane-guard / pi-subagents-guard / unused-exports / lifecycle-ledger-guard / test-import-graph / plan)全绿;
  • skipped 的 13 项是带独立触发门(e2e 真实客户端车道、hermetic registry、red-signal 定时哨兵)的车道,PR 运行按设计不跑。

注:镜像缓存一度停留在旧 sha 的 pending 快照,上面结论取自对 head sha check-runs 的单次直读(非轮询)。

收工判定:代码审核通过(八问见前)+ base 已同步到当前 master + 全量测试绿 → 本 PR 可合。合并动作留给你(owner-only)。合并后 #5219 可以关单验收。

@ranxianglei ranxianglei left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(ai: vllm/qwen3.8-27b)

APPROVE — 可合。 单模块修复,#5219(p1 冷启动崩溃循环)的根因修复,回归门到位,行为变更已披露。

结构化八问:

  1. 是什么问题:默认配置下,每次冷启动在 proxy listen 之前把整个会话存储同步解码一遍。会话文件涨到几千个时,打爆 dsh 启动器的 60s 健康预算 → 子进程被杀但没确认死、还攥着 index.db 写锁 → 下一次 spawn 被这把锁毒化 → spawn-kill 死循环,最后 fatal load failure(#5219,p1)。

  2. 什么原因:根因在 #3199 bounded-boot 解析窗口的停止条件 candidates >= maxSessions AND bytes >= maxBytes —— 两个条件都不绑定时退化:maxSessions=0(sessionWarmMax() 默认值,计数项恒真)或「大量小文件 + 大字节预算」时,循环在 listen 前把每个文件都解码完,随后 savedAt-desc 修剪又把它们全 pop 掉,纯浪费的同步工作随语料规模线性增长。

  3. 影响范围与严重程度:p1。任何会话存储长大的安装都会中(报告者 ~3.5h 内从 0 涨到触发挂起);dsh/pi 等 launcher 用户每次冷启动都挂,服务整体不可用。小存储的正常安装不受影响(字节预算会先停住循环)。

  4. 怎么修:给窗口加一个「已解码文件数」上限,与既有计数/字节项并列:maxSessions=0 时为 0(反正一个都活不过修剪),否则 min(2048, max(64, 16×maxSessions)),正常语料永远撞不到(字节预算先停)。超上限的文件仍走 loadSync 懒加载,其别名记账交给本就存在的 listen 后 scanRemainderInBackground。快速恢复 listen,记账合作式后置。

  5. 回归风险:逐条过 boot 窗口承担的既有行为——warm 集仲裁(savedAt-desc)、字节预算、legacy 全量解析分支、listen 后余量扫描、loadSync 懒加载——全部保持。唯一变化是 pre-listen 解码次数被封顶:maxSessions=0 时 warm 集前后都是空(不变);maxSessions>0 且语料小于上限时完全一致。边角(PR 已披露):语料大于上限时,warm 仲裁只看 mtime 最新的 cap 个文件而非全量,某个 savedAt 比 mtime 位置更新、却排在 cap 之外的文件会从「预热」降级为「按需加载」(可用性保留)。无 fail-fast 变吞错、无阈值/时序/输出格式漂移(除已披露的上限外)。

  6. 是否破坏缓存:不涉及——没碰任何缓存/重试/增量游标/去重键策略,只动 boot 预热集大小。

  7. 设计方向:未改。仍落在 #3199 的延迟设计里(mtime 定序窗口、savedAt 仲裁存留、余量 listen 后扫),只是把退化情形下的窗口收紧到设计本意。

  8. 新配置:无。只有三个内部具名常量(BOOT_WINDOW_DECODES_PER_SESSION/MIN/MAX),没有新 env/config/CLI 字段。

验证:根因链对着 PR head 代码核过(sessionWarmMax() 默认 0 @ src/knobs.ts:420;initSessions 传 maxSessions=0 @ src/session.ts:1291;bootBounded 窗口循环 @ src/persist.ts:964)。本地在 rebase 后的 head 跑了新门 3/3 + 相邻 bounded-storage / bounded-storage-scale / issue3199-overview-cold-scan 共 15/15 绿;全量判定以远程 CI 为准(lane 状态为绿)。diff 相对 master 只多 src/persist.ts(+21)与新测试(+143),wire-exit-matrix.test.ts 那处来自 ci-fixes 合并,非本 PR 贡献。

判定:可合,满足自动合并门槛(§7.4):单模块修复、回归测试红转绿、不碰 kernel/wire/config/持久化格式、diff 干净、引用 #5219。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

✅ review-worker-r1 独立复审完成(非照抄前序,自己重做一遍):重读修复 diff → 对着 PR head 代码核根因链(sessionWarmMax() 默认 0 @ src/knobs.ts:420 → initSessions 传 maxSessions=0 @ src/session.ts:1291 → bootBounded 窗口循环 @ src/persist.ts:964)→ 本地在 rebase 后 head 跑新门 3/3 + 相邻 boot 窗口套件(bounded-storage / bounded-storage-scale / issue3199-overview-cold-scan)15/15 绿。

判定:APPROVE / 可合。 单模块根因修复(给退化窗口加 decoded-file-count 上限)、回归门有牙(旧码 100/70 pre-listen 解码 → RED)、行为变更已按规范披露、不碰 kernel/wire/config/持久化格式、diff 相对 master 只多 2 文件(wire-exit-matrix 那处来自 ci-fixes 合并,非本 PR)。无顺手可修的小问题——代码已达标(具名常量、机制注释、风格一致)。

说明:GitHub 侧的正式 APPROVE 状态因「不能 approve 自己的 PR」(当前凭据即仓库属主账号)被平台拦下,无法置为 approved;已改以完整结构化八问评论形式落在 PR #5634(review id 5763091646),判定内容完整在案。合并动作留给你(owner-only);合并后 #5219 即可关单验收。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(bot) 🏷 冲突已解决并推送(attempt 1/3)。本条按七问汇报。

核对说明:镜像线程标注的上游号 5599 实为该 PR 引用/关闭的 issue 编号;真正的上游 PR 是 #5636(head 2026-11-04_storage-migrate-json-to-sqlite,已按标题精确匹配并在 GitHub 实况核实)。后续处理本线程请以 #5636 为准。

做了什么:把分支 rebase 到当前 master(4be21b08ed),解决全部冲突,force-with-lease 推送:84fa38814e → 4b186429fd(推送前已 fetch 确认分支无他人并发提交)。本地验证:typecheck 干净、build 成功(dist-external OK)、定向跑本 PR 回归套件 tests/storage-migrate.test.ts 7/7 通过;全量套件留给 CI。

七问

  1. 是什么问题:PR 与 master 合并状态 dirty(有冲突),无法合并。
  2. 什么原因导致的:master 在分支基点(11-04)之后完成了文档布局迁移(根目录只留四个核心文件,CONFIGURATION.md/CONFIGURATION.zh-CN.md 移到 docs/configuration*.md,根路径留重定向 stub),而该 PR 的三个文档 commit 仍在编辑旧根路径文件——纯文档路径漂移,代码零冲突。
  3. 影响范围与严重程度:仅合并被阻塞,无任何行为影响(冲突全部落在文档文件);不修则 PR 永远合不进。
  4. 怎么修复的:rebase 后逐点保住两侧意图——① 根路径文件一律保留 master 的 stub;② migrate 说明文字改由 yaml 种子(website/config-reference/process.yaml)承载并重跑 tools/gen-config-docs.mjs 生成到新位置 docs/configuration*.md(已验证生成物相对 master 恰好只有 archiveAfterDays 一行变化,无既有漂移);③ 最后一个 commit 的「子进程部署」段落按原锚点重新落进 docs/configuration*.md。非文档文件与原 PR 意图逐字节一致(最终 diff vs master = 16 文件 +714/−31,与原 PR 足迹相同,仅两个根 CONFIGURATION 换成 docs/ 对应文件)。
  5. 是否有回归问题:无。代码、测试、脚本均未经过我的手工改动(冲突只在文档);文档内容 en/zh 双语完整保留(migrate 条款 + 子进程部署段落各就位);typecheck/build/定向套件本地绿。高危模式逐项过:无语义漂移、无阈值/时序/输出格式变化。
  6. 是否破坏缓存:不涉及(纯文档重定位 + rebase,未触碰任何缓存/存储逻辑)。
  7. 是否改了设计方向 / 引入新配置:不涉及;无 kernel/ diff,未触发任何授权门禁,无需决策项。

当前实况(推送后即时核实):GitHub mergeable=true,mergeable_state=blocked(冲突已清,blocked = 等检查/批准,属正常态);新 head CI 已触发:25 success / 12 skipped / 12 in_progress,暂无失败。镜像缓存此刻仍显示旧 sha(poller ~60s 刷新延迟),稍后自会跟上。CI 全量结论以远程为准,红了再说。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(bot) 🏷 更正:上一条(floor 11,「冲突已解决并推送」七问摘要)是误发到本线程的——它属于 bili storage migrate PR 的线程 #5639(上游 GitHub storage-migrate PR),与本线程(bounded-boot parse window PR)无关。正确摘要已在 #5639 重发。请忽略本线程 floor 11 的内容;抱歉造成噪音。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

3 similar comments
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

…lict

Took master's lag-aware teardown budget (ci-fixes c37293b) for
tests/wire-exit-matrix.test.ts — a strict superset of this branch's
win32-scoped constant: same ABORT_TEARDOWN_BUDGET_MS (win32 20s / else
10s) plus the event-loop-lag extension (teardownPollContinues,
TEARDOWN_POLL_MS) and its arithmetic test. No intent from either side lost.
src/persist.ts auto-merged clean (decode-cap fix intact).
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] 已解决 PR #5634 与 master 的合并冲突并推送(merge 方式,fast-forward,无 force)。

This run (English): Merged current master into the PR branch, resolved the single conflict in tests/wire-exit-matrix.test.ts, and pushed. The mirror check cache was stale (still showing the pre-push sha / dirty), so I confirmed the live state with a single read: head_sha=26dd852635, mergeable=true, mergeable_state=behind — the dirty conflict is cleared; behind only means master advanced again and is not a merge blocker. CI will re-run on the new head (the previous head's test lanes were green).

七问(中文):

  1. 是什么问题:PR [PR] fix(#5219): bound the bounded-boot parse window by decoded-file count #5634(bounded-boot decode-cap 修复)与 base 分支 master 冲突(merge state: dirty),无法合并。
  2. 什么原因导致的:master 在分支切出后前进了数百个提交;其中 tests/wire-exit-matrix.test.ts 的 abort-teardown 预算从「flat deadline」演进为「event-loop-lag 自适应」(ci-fixes c37293b),与本分支经 ci-fixes 合入的 win32 分段常量改动落在同一行,产生文本冲突。
  3. 影响范围与严重程度:仅阻塞本 PR 合并,不影响任何已发布行为;严重度 = PR 无法 merge(需解冲突)。
  4. 怎么修复的:把当前 master(33104b1f95)merge 进 PR 分支;唯一冲突文件 tests/wire-exit-matrix.test.ts 取 master 版本——git diff :2 :3 核实它是本分支版本的严格超集(同一 ABORT_TEARDOWN_BUDGET_MS win32=20s/else=10s 常量 + 新增 teardownPollContinues/TEARDOWN_POLL_MS 滞后机制 + 对应算术测试),两边意图均保留、无丢失;src/persist.ts 自动合并干净(decode-cap 修复完整)。
  5. 是否有回归问题:无。PR 相对当前 master 的净贡献 = 仅 Service crashed, sessions exploded instantly. | 服务崩溃,会话瞬间爆炸 #5219 修复(src/persist.ts +21、tests/issue5219-bounded-boot-decode-cap.test.ts +143);wire-exit-matrix 的 ci-fixes 改动已被 master 吸收、不再是 delta;abort-teardown 取的是 master 的更新版本(同一意图的严格改进,非语义漂移)。
  6. 是否破坏缓存:不涉及(无缓存/重试/游标/去重键改动)。
  7. 是否改了设计方向 / 引入新配置:不涉及(纯冲突解决,无新配置、无架构转向)。

判定:冲突已清除,PR 处于可合并(mergeable / behind)状态,可进入正常 review/merge。

This branch has not been deployed

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Service crashed, sessions exploded instantly. | 服务崩溃,会话瞬间爆炸

1 participant