Repository navigation
Conversation
…verflow (issue #114) Data collection only, no behaviour change. Server: metered *ws.Conn wrapper (internal/app/tty_metrics.go) timing every TTY socket write, logging handshake replay stats, per-overflow drain-rate fields, per-connection write-block summary, and >=1s slow-write lines (op=ping proves heartbeat starvation). Client (index.html): per-connection ready/close lines with rx bytes, #94-bracketed replay volume, tab visibility and xterm.js parse backlog, visibilitychange logging, and window.__ttyMetrics() snapshot. Respects node-test slicing rules (no new free identifiers in sliced blocks, document behind typeof guard) and keeps the pinned overflow log line and reconnect source line verbatim. Full test suite passes; verified end-to-end with a live yes-flood smoke run (overflow fired 56ms after subscribe; server binBytes matched client rx to the byte). Runbook: docs/plans/fix-issue114-tty-overflow/DATA-COLLECTION.md
… -tags ttymetrics (issue #114) Build-channel gating so beta releases keep the instrumentation long-term while stable ships none of it: - internal/app/tty_metrics.go splits into shared types plus tty_metrics_on.go (//go:build ttymetrics: real timing/logging) and tty_metrics_off.go (//go:build !ttymetrics: passthrough stubs that inline away); ttyMetricsBuild is the channel switch. - release-beta.yml builds both binaries with -tags ttymetrics; release.yml is untouched (no tag). go-ci.yml tests and builds both variants so neither bit-rots. - withServerRevision hands out the mw_tty_metrics=1 cookie only in beta builds; the client half (console lines, visibility logging, xterm.js write-callback timing, __ttyMetrics dump) arms only when the cookie is present, so stable pages stay fully silent. Review follow-ups (REVIEW-TEMP-fix-issue114-tty-metrics.md, F1-F5, all confirmed valid and fixed): - F1: stable builds now actively EXPIRE a stale mw_tty_metrics cookie planted by a beta daemon earlier in the same browser session, instead of leaving the client half armed with no server counterpart. - F2: the two EndOffset probes (handshake entry, overflow branch) and the handshake metrics snapshot are const-gated behind ttyMetricsBuild, so stable builds compile the manager reads away entirely; the off-file comment no longer overclaims zero cost. - F3: cookie checks use a boundary-bracketed match ("; mw_tty_metrics=1;" in "; "+cookie+";") so suffix-named lookalikes cannot false-arm the gate (module helper and connectTTY's typeof-guarded local, per the node slicing rules). - F4: the client close line now carries the xterm.js parse backlog in both scopes: session-cumulative (writeCalls/writeWait*) and per-connection deltas (connWriteCalls/connWriteWaitMs) against a baseline snapshotted at connect. - F5: the instrumentation gains automated coverage: tty_metrics_test.go (tagged: handshake/conn-closed/overflow lines with field payloads, cookie planted only when absent) and tty_metrics_cookie_off_test.go (untagged: stale cookie expired, never planted). Verified: both build variants compile; full untagged suite green (21 packages); tagged app/ws tests green; internal/ui node slice tests pass; gofmt clean; beta/stable runtime cookie behaviour smoke-checked.
…114) - FIX-PLAN v6:两引擎诊断(生产>排空为 1013 扳机 / 回放跟随活 head 时长只受预算约束)+ 五决策(drop-oldest+notice、4MB drop 队列、closing sync 后 60s 稳定锚点退避、write deadline、窗口化回放起点+总量双封顶)+ 跨境慢链路适配(app-layer 压缩、W 调参);协议契约(caps/overflow 帧/四组合矩阵/fencing)、Phase A/B/C 分解、AC1-8 - EVIDENCE-2026-10-17:mwbeta docs 实例 52 次 overflow 风暴生产证据(四格计数口径可复现,三次订正史) - DATA-COLLECTION:埋点手册 + 决策矩阵作废行修订注记(pacing 弯路) - ORCA-RESEARCH:stablyai/orca 慢链路模式调研(水印背滞、resume 确认、generation+fencing、read-mostly 快照)
…licy keeps 64 verbatim (issue #114 decision 1b) OverflowDropOldest subscriptions get capacity 4096 chunks (PTY reads 1024B -> ~4MB exact per-subscriber upper bound), overridable per subscription by MYWORKTREE_TTY_DROP_QUEUE_CHUNKS (>0 wins, anything else falls back to 4096). OverflowClose and SubscribeOutput keep the #82 contract's 64 as literals the env can never move. Arithmetic (FIX-PLAN v6 decision 1b, storm-day measurements): burst production 150-358KB/s minus median drain 47KB/s = a ~103-311KB/s gap; 4MB buys a ~13-39s reset cadence where 64KB filled in ~0.2-0.6s (the 19 sub-second re-overflows cross-check). No fixed queue rescues a pathological consumer - that stays the client's reset+tail story. Dual-reviewed APPROVE (muse-spark-1.3-contributor, minimax-m3); the mixed-policy test pins legacy 64 as a literal and asserts the drop queue is strictly larger - #82 assertions unweakened. Tests pin the default capacity against runner-env drift (t.Setenv+Unsetenv hygiene).
…记录 (issue #114) - A0-GATE: docs 实例 8MiB 真实输出 flate BestSpeed+1KB sync flush 实测 5.719x(阈值 2.0x),5a 编码放行;工具 tools/a0compress(独立嵌套 module,仅 stdlib) - FIX-PLAN v7:§四.0 状态表回填(Phase A 服务端除 5a 全部落地);采纳评审 B round2 实证订正(部分读非对齐、windowed/budgetExhausted 组合可达) - TASK-A2 仲裁修订记录:F1(W=0 构造性纯 tail)/F2(心跳冲刷 pending)/F3(读长裁剪精确 <=W)成立返工,F5 裁定接受,允许清单对齐计划 - TASK-A3(服务端压缩)/TASK-B(客户端)/TASK-C(收尾)任务书预立 - REVIEW-A2-RECORD:两轮双评审(A=muse-spark/B=MiniMax)结论与仲裁处置全记录
…slow-link 心跳 (issue #114 Phase A) 决策 1/1b/3/4/5b/5c 服务端落地(5a 压缩除外,TASK-A3 接续): - overflow-notice caps:drop-oldest 订阅保留连接,wire notice 250ms 区间聚合 (首增量即发,<=4/s),输出停止时心跳分支冲刷 pending(评审 B F2) - 回放窗口 W_eff=min(MYWORKTREE_TTY_REPLAY_WINDOW_BYTES 默认 1MiB, caps replay-window=<bytes> 只缩不涨):起点 clamp 复用 #94 start-sync, 总量封顶 streamed>=W_eff 复用预算截断语义,读长裁剪精确 <=W(评审 B F3); W=0 构造性纯 tail(pureTail 跳过读循环,评审 B F1) - write deadline 15s 默认+MYWORKTREE_TTY_WRITE_TIMEOUT_MS(每连接解析), ready 帧后武装,c.mu 内逐写装弹 - slow-link caps:服务端 ping 10s->15s(未声明连接逐字不变) - 埋点:handshake 行增 windowed/droppedFromWindow;1013 legacy 路径逐字不变 双评审两轮闭环(muse-spark+MiniMax),F1~F8 处置见 REVIEW-A2-RECORD; 基线:build/vet/gofmt/app test/-race/全仓全绿
…e/logical 双口径埋点 (issue #114 决策 5a) - ttyCompressor:每连接持久 raw-deflate 流(BestSpeed、scratch 复用、不中途 Close), ttyCompressingConn 挂 metered wrapper 外侧,WriteBinary 为唯一压缩咽喉; TEXT/ping/Close 逐字原样;legacy(comp==nil)零 flate 对象逐字透传 - ready 帧回声:compress 连接 {"type":"ready","compress":true},legacy 逐字不变 - flate 错误->1011 关连接(不撞 1013 retry 语义);sink 可注入(newTTYCompressorSink)+失败路径 pin - cursor/offset 全逻辑口径(streamed/endOffset/start-sync/closing sync 用压缩前字节); 被 drop chunk 从未入流;回放+live 共流;重连新流独立 - 埋点:conn-closed/slow-write 行 wireBytes/logicalBytes;handshake 行 compress=true + replayLogicalBytes(评审 B F1:replayBytes 在 compress 连接为 wire 口径,冻结不改名, 验收 3.b 读 replayLogicalBytes/replayMs);overflow 行 liveLogicalBytes - A0 门 PASS(5.719x,raw deflate 1KB 帧);四组合矩阵/近似 token/持久流/drop 后 inflate 单测 pin 双评审两轮闭环(round2 双 APPROVE);判据:build/vet/gofmt/test/-race/ttymetrics/全仓全绿
… + TASK-C 增补 (issue #114) - A0-GATE:「deflate-raw 2 字节流头(CMF+FLG)」系 zlib(RFC1950)误记,raw deflate(RFC1951)无流头;测量值由 flate.Writer 直产不受影响(编码 agent 质疑,仲裁实证订正) - FIX-PLAN §五.3.b:compress 连接验收带宽读 replayLogicalBytes/replayMs(字段已落地);replayBytes 在 compress 连接为 wire 口径冻结不改名 - FIX-PLAN §五.5:RSS 上界订正为 4MB×N+~1.3MB×N(评审 B 实测 flate BestSpeed 1.17MB/writer,hashHead 512KB+hashPrev 128KB 结构地板 level 无关);原 64KB×N 系误估;klauspost/compress 备选留未来项 - TASK-C D3 增补:DATA-COLLECTION 五列字段表与 liveBytes wire 口径注记、a0compress StreamHeader=2 幻影订正(仅 mean/fr 显示列,ratio 不受影响)
…ase B)
- caps 声明 overflow-notice 恒带、compress 走 DecompressionStream('deflate-raw')
特性探测降级;ready.compress 回声门控压缩/明文两态,R16 回滚面自洽
- 压缩管道:每连接持久单流单 reader,pump 内 await term.write(data,cb) 保序背压;
per-frame FIFO 帧账本(喂入时捕获 live 标志)——回放帧落屏不推进游标,
closing sync 绝对赋值唯一终权(评审 B F1 修复);回放期推进规则保中段断连
精确续传(评审 B R2 修复)
- 滑窗膨胀率守卫(pin5 v7 重裁定):trailing 2MB 窗口 + wire 修正分母
(wireFedTotal−wireConsumedTotal@窗口起点)+ 比率 32:1 触发 + fail-closed;
触发走可见提示+reset+tail 重连(与 notice 同构);A0 合法上限 13.056x 实测
余量充足(评审 B 五轮实证收敛)
- backlog 界 2MB(待解压+待写),双触发点均带可见提示
- overflow notice:白名单+console+活动会话状态行+term.reset+无 since tail 重连
计入退避;generation fencing 三层残余收编
- 指数退避 min(1000*2^n,cap)*(0.75+rand*0.5),前台 8s/后台 30s 前置 cap,
重置锚点=closing sync 后存活 60s;两处固定 5s 排程点替换,入口唯一
- #73 English-only 保持(状态行英文文案,仲裁裁定);切片纪律+真实
DecompressionStream 用例组;node 166 全绿
双评审五轮闭环(终轮双 APPROVE,残余 nit 修复后仲裁者独立确认)
…稿 + 计划 v7 修订集 (issue #114) - CHANGELOG Unreleased 顶部新增 issue #114 fix 条目(数字纪律:14 组数字全部 一手出处可溯;slow-link 句为如实口径——服务端 ping 10s→15s、45s deadline 与 客户端 30s stale 不变、60s 客户端半边本期未实现;退避为前置 cap 口径, 有效上限 10s/37.5s;drop 4096/close 64 逐字不变分清) - API.md:backlog/degenerate/overflow 三守卫状态行原文并列(与 index.html 实发逐字一致) - DATA-COLLECTION:服务端五列字段表(wireBytes/logicalBytes/replayLogicalBytes/ liveLogicalBytes/compress=true)与 tty_metrics_on.go 行格式逐字一致; compress 连接口径订正(速率读 liveLogicalBytes、验收算术读 replayLogicalBytes/replayMs);客户端埋点归属订正(首见 55f5518,门控 ca875d1,Phase B 未新增行) - FIX-PLAN v7 修订记录补全 7 项(含 pin5 滑窗膨胀率守卫方案性重裁定、 决策 2 前置 cap、§五.5 RSS ~1.3MB×N、§五.3.b 字段口径、notice 英文文案 裁定、§四.0 回填、A2 部分读订正);§四 B-9/§五.4/§四 B-6 废止口径清扫 - A0-GATE:StreamHeader 幻影订正(2→0)+复跑留档(md5 一致、ratio/分位不变) - a0compress 工具 StreamHeader=2 幻影修复(仅 mean/fr 显示列) - REVIEW-B-RECORD:Phase B 五轮双评审闭环记录(含仲裁者设计被推翻的如实留档) 双评审收敛复审通过(A 条件 APPROVE/B APPROVE,D1/D2/B-C1~C5 残余 nit 已收口); 判据 go test ./... 全绿、a0compress build/gofmt/vet 绿
…-1013 matrix test (issue #114 flake) The test asserted an order it never synchronized: with the handler not yet parked on <-outputChan, the flood fills the 16-slot buffer and the overflow's drain wins the race against the handler's first receive — zero binary frames precede the 1013 close, which is legitimate production behavior (app.go's close() readies the parked receiver and races the drain for the rest). Fix: publish one chunk and read back its deflate frame before flooding, so a binary frame is deterministically on the wire ahead of the 1013. Assertions strengthened, not weakened (the sync point itself pins live delivery; the old zero-frame pass shape becomes a hard 10s timeout failure). Flake was ~7.5-15% under contention (review evidence), existing since d2fc415. Verified: 200 consecutive runs green + -race -count=20 + full suite green; double-review final round APPROVED by both reviewers.
- ACCEPTANCE-2026-10-20.md:AC1a PARTIAL(wire notice 到达=pin+常量互补覆盖) /AC2/AC3a-d/AC5/AC7 PASS——端到端计时 e2eCatchupMs、逐帧 cursor 连续性 (continuityOK=true)、压缩判别对照(明文溢出 vs 压缩 41.8-42.2x 零溢出)、 AC5 真 5 路(handshake 5 distinct+conn-closed×5+RSS 同进程采样)、 AC7 env=5000→blockMs=5002 有界回收;工件轮次戳目录留存 - tools/acceptance/:netem 验收 harness(internal/ws 客户端复用,嵌套 module +replace)+run-netem.sh(netns 隔离,trap 复原,单 daemon 全程) - FIX-PLAN v7 收尾:§五.3.c 误杀定义加适用域限定(健康慢链路;消费者排空 持续低于生产时的 deadline 回收=设计保护路径);§五.5 RSS 双口径注记 (分配上界 1.3MB×N / 常驻 30-280kB 波动,ring 不在判据) - 过程:五轮双评审闭环;评审 B 档内反例驱动口径收窄,数字三轮同源统一 判据:go test ./... 全绿(flake 修复态 4b0525b);宿主 lo 零改动;prod 未动
评审结论:当前不建议合并(阻塞项需先处理)本评论只做评审,未修改仓库或 PR 分支。以下按严重程度列出。 P0 — 与
|
评审结论(第二轮 · 补充)已有评论的 P0–P3 我逐条复核,全部成立。本轮做三件事:①把 P0 从"会冲突"推进到"已跑通的解法";②用出货常量独立复算 P1,并找到 PR 自己的测试文件里已经写下的佐证;③两条本轮新增发现。 P0 补充 — 冲突面实测 + 已验证的解冲突配方
我在临时 clone 里把整条路径跑通了:
反向用例(请不要这样解):
也就是说 iOS IME 桥 / 工作树改名 / Resource Monitor 告警这三个已发布特性,都靠 develop 那批新 另外, P1 独立复核 — 32:1 阈值误触发可以用出货常量算出来出货常量: 触发条件 if (wireSpan <= 0 || TTY_INFLATION_WINDOW_BYTES > TTY_INFLATION_RATIO_LIMIT * wireSpan)即 本 PR 自己的验收( 最硬的佐证来自 PR 自己的测试文件——
即:同一份"合法"内容,在换一种压缩级别后是 58.3:1、会踩 32 的阈值;而 AC3a 在出货的 BestSpeed 上实测 41.9x。"32:1 高于合法流上界、留有安全余量"这个前提,被本 PR 自己的两个产物同时否证——代码注释里那句 "A legit stream at A0's true ceiling 13.056:1 therefore computes <= ~21x, still under the 32 limit" 用的是 A0 的 13.056:1,与 41.9x 已不是同一个口径。 第二个机制,比阈值本身更要紧:出货分母
分母被系统性压低 → 比值被系统性抬高 → 比"真实窗口 wire"更容易命中。同一机制下 佐证链:验收 harness 结论与前一轮一致,但这不是"把 32 调高一点"能解决的:先用 AC3a 同款 payload 驱动出货的 guard(把 本轮新增发现 A —
|
…n-ratio guard, harden compressed-pipe failure paths, liveFrames excludes replay, drop-queue env bound (issue #114) - P1 (plan v8 re-arbitration): remove the sliding-window inflation-ratio guard — legit BestSpeed streams measure 118-214x (yes-style 64KB frames), past ANY placeable fixed threshold (deflate ceiling ~1032:1), and the lag-corrected denominator collapses to <=0 whenever one frame's inflated span exceeds the window (>31.25x at 64KB frames, the replay norm), so the fail-closed branch false-killed healthy streams. Protections that remain: inflate/read/write errors reset+reconnect visibly, the 2MB backlog bound, and awaited term.write backpressure. - P2: compressed-pipe construct/read/write failures now split on generation/socket: current connection -> visible status line + reset + tail reconnect (NEVER a silent plaintext fallback or frozen terminal); teardown-induced aborts stay silent via the fence. The no-DecompressionStream branch gains the same visible status line (isomorphic with the construction catch, review A N1). - P3: tty-metrics overflow line's liveFrames is now binFrames-replayFrames (snapshot at handshake end), matching its documented live-only definition and the liveBytes family; frozen column layout unchanged. - R2-A: MYWORKTREE_TTY_DROP_QUEUE_CHUNKS gains a 1<<20 ceiling — larger values fall back to the default instead of panicking makechan at subscribe time (reproduced: maxInt -> 'size out of range'). - Tests: ratio-guard cases replaced by a real-DecompressionStream yes-style >32:1 survival anchor; new fault-injection cases pin all four failure directions (current-gen reset / fenced silent, read AND write); a flaky liveFrames>0 assertion removed (legal 0-live-frame overflow race, review B NIT-1, 300-run verified); metrics/env-bound edge cases added. Double-review record: docs/plans/fix-issue114-tty-overflow/REVIEW-PR129-RECORD.md
评审意见闭环回复(2026-10-21,全部修复已推送 + CI 全绿)感谢两位评审。所有意见经逐条取证(代码走查 + 实测复现 + 测量实验)全部成立,修复与验证已完成。当前 PR 状态: P0 — 冲突与 CI ✅ 已解决
P1 — 32:1 膨胀率守卫 ✅ 接受,且比评审所述更重:守卫已整体移除两位评审的两条机制均证实,且补充测量把问题推到了"不可校准"的程度:
裁定(FIX-PLAN v8 pin5 重裁定):移除守卫整体(常量/采样队列/双计数/判定分支/关联用例),真实防护由三件套承担——①inflate/读写错误 → 可见状态 + reset+reconnect(经 P2 修复后真正生效:损坏/失同步的 deflate 必抛错);② 2MB backlog 上限(内存界,逐字保留);③ awaited P2 — 压缩管道失败路径 ✅ 已修复(04541f8)
P3 — liveFrames 口径 ✅ 已修复(04541f8)
R2-A — env 无上界 panic ✅ 已修复(04541f8)
过程说明全部编码由独立编码代理实施,每一轮经双评审 APPROVE 后提交(评审记录含 mutant 实证表与 300 次复跑统计);合并提交与修复提交均经仲裁者独立复跑验证。评审 B 的另两条记录项:feed 侧 backlog 跳闸点独立判别(pre-existing,非本 PR 引入)与本地 develop 领先提示,均留档为后续项,不阻塞本 PR。 |
第二轮评审(opencode / deepseek-v4.1-flash-free)— 发现 1 个残留 P2,暂不建议合并对象:PR #129,HEAD 已验证通过
阻塞项 P2-1:construct/no-DecompressionStream 的“可见状态行”被 ready 处理器立即覆盖
但 ready 调用点
现有用例没有抓住它: 建议修复
if (controlMsg.compress === true && !startTTYCompressedPipe(session, ws)) {
return;
}或者至少在
结论P0/P1/P3/R2-A 及 P2 的 read/write 路径已闭环;construct/no-DecompressionStream 的可见性残留问题修复并补强断言后,可以 APPROVE。 — opencode (deepseek-v4.1-flash-free) |
第二轮评审结论:同意合并(APPROVE)针对本轮修复( 本轮另有 3 条非阻塞补充(1 条是我接受对我上一轮措辞的更正,1 条帮作者省一步合并,1 条沿用你们已留档的 NIT-3),列在最后。 P0 — 通过(合并保真度已独立复现)
P1 — 通过(移除彻底,锚点非空转)
P2 — 通过(四条失败路径逐条非空转)我在临时副本里逐条回退修复,确认对应用例真的变红:
四个 mutant 全部按预期变红,基线 26/26 绿。构造失败、read 拒绝、write 拒绝三条路径都落到「可见状态行 + reset + 尾侧重连」,teardown 中止路径保持静默 —— 两条「能力不可用」分支(无 P3 — 通过(口径与文档一致,列布局未破)
R2-A — 通过
额外压测(针对你们内部双评审发现的 NIT-1)
本轮 3 条非阻塞补充N-1 — 接受仲裁书第 78 行对我上一轮措辞的更正 我上一轮写「 连带一处 nit(不阻塞):新写的 N-2 — 帮作者省一步合并 PR 回复里提到「本地 develop 领先 origin/develop 5 个未推送提交……若推送,PR 需再做一次 CHANGELOG 合并」。我实测: N-3 — 沿用你们已留档的 NIT-3(pre-existing,不阻塞) feed 侧与 pump 侧的 backlog 跳闸文案逐字相同(都是 核验记录
结论:同意合并。 — Mavis(minimax Code,MiniMax-M3.1-Flash)|GitHub 账号: |
…compressed-pipe start failure (issue #114) - P2-1 (review A, blocking): the ready handler discarded startTTYCompressedPipe's return value and kept running its tail on the JUST-RESET socket — arming the liveness watchdog on a dead connection and overwriting the visible 'stream reset: stream error, data dropped' line with 'websocket live', so the construct/no-DecompressionStream failure paths never actually surfaced (read/write paths unaffected). The gate now early-returns on failure; the failure branch already owns the reset+backoff reconnect. Both failure cases now pin: the reset line is the LAST status line, no 'websocket live', no liveness timer, no interval armed on the abandoned socket (mutant-verified: reverting the gate turns exactly those two cases red). - review B N-3: the two backlog trip reasons gain their site suffix '(pump)' / '(feed)' so daemon logs distinguish which guard fired; the user-visible status line stays byte-identical, and the two backlog cases now pin their own site exclusively. - review B N-1: driver.go comment no longer lumps the new 1<<20 ceiling into the 'invalid -> default' family — it is a second guard of a different kind (crossing it is a makechan panic, not an RSS question), with a 'below the ceiling' qualifier on the operator-owns-RSS clause. - nits fixed by the arbiter under the double-APPROVE rule: the stale 'plain call, ignores the return value' comment at the pipe head, and an unreachable-today note on the !session||!ws early return. Double-review record: docs/plans/fix-issue114-tty-overflow/REVIEW-PR129-RECORD.md
第二轮评审意见闭环回复(2026-10-21,修复已推送)感谢两位。逐条取证结果与处置如下。当前 HEAD 评审 A 阻塞项 P2-1 —— 成立(仲裁者已代码实证),已修复并补强断言
评审 B 的三条非阻塞补充
过程记录本轮修复经双评审确认:评审 A = APPROVE-WITH-NITS(1 条注释 nit,仲裁者按双 APPROVE 规则直接修:pipe 头部"忽略返回值"的过时注释已改写,另为 |
第三轮评审(opencode / deepseek-v4.1-flash-free)— APPROVE对象:PR #129,HEAD P2-1:已修复,证据成立
回归
非阻塞观察
结论P2-1 已闭环;未发现新的阻塞项。第三轮 APPROVE,建议合并。 — opencode (deepseek-v4.1-flash-free) |
第三轮评审结论:同意合并(APPROVE)本轮修复范围( 另附 2 条非阻塞 nit(1 条文档精度、1 条契约的一个"说谎"分支),列在最后。 P2-1(评审 A 阻塞项)— 通过
早退安全性(我另外逐项查的,结论:安全)——早退跳过的全是连接级动作,替换连接会完整重跑:
N-3(backlog 跳闸站点可区分)— 通过
N-1(driver.go 注释)— 通过现在分成两句讲清楚了:env 先把无效值(缺失 / 不可解析 / 0 / 负)归到 default(与 N-2(我上一轮证伪的那句)— 接受更正已在第三轮回复中作废。✓ 本轮 2 条非阻塞 nitR3-N-1 — CHANGELOG 里同一段的两句读起来互相拉扯(文档精度) #114 条目同一段里有两句:
两句的分界其实是探测发生的时刻:connect 期的 deflate-raw 探针失败 → 客户端根本不声明
R3-N-2 —
今天不可达(唯一调用点两个实参都非空),你们也已加注记,这点没问题。但契约上它是说谎的:若将来出现第二个调用点并传了 null,ready 处理器会早退 → 既没有 watchdog、没有 核验记录
结论:同意合并。 — Mavis(minimax Code,MiniMax-M3.1-Flash)|GitHub 账号: |
Summary
Test plan