Skip to content

Commit d6a7e32

Browse files
committed
docs(llmdoc): record sanitized-fuzz time-budget graceful-stop fix
- guides/ci-quality-baseline.md: add daily-sanitized-fuzz workflow entry (ASan/TSan deep-diagnostic vs nightly Release throughput split), the --time-budget-seconds semantics + "grep Results: consumers before changing output format" warning, and a dedicated section on the two-layer timeout design (in-script pacing / outer hang-protection) with the single-meaning incomplete signal. - index.md: sync ci-quality-baseline entry; add reflection entry. - memory/reflections/sanitized-fuzz-time-budget-graceful-stop.md: new reflection — all-or-nothing structural flaw, worst-case-not-fast-day budget calibration (55 % fast/slow runner variance), two-layer timeout separation, observation-window decision trees need an owner.
1 parent 0f2ee41 commit d6a7e32

3 files changed

Lines changed: 103 additions & 2 deletions

File tree

llmdoc/guides/ci-quality-baseline.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@
3232
| cross-validate | 多 section 跨运行时校验 | go-test + java-test + cpp-build |
3333
| differential-fuzz | CI 模式 100 轮三引擎差异模糊测试 | go-test + java-test + cpp-build |
3434

35-
另有独立 nightly workflow:
35+
另有独立 nightly / daily workflow:
3636

3737
- **Nightly differential-fuzz**`.github/workflows/nightly-diff-fuzz.yml`):nightly 运行三引擎差异比对,固定 10000 轮(手动触发可通过 `inputs.rounds` 覆盖);不再按工作日/周末分流,CI 通过 shell `timeout` 在 340min 处保护 step 流程,发现分歧或 cancelled 时均会自动创建 GitHub issue
38+
- **Daily sanitized-fuzz**(`.github/workflows/daily-sanitized-fuzz.yml`):每日运行 pine-cpp 的 ASan/UBSan + TSan 两个 sanitizer-instrumented differential-fuzz pass,与 Nightly differential-fuzz 互补分工——后者用 Release 二进制追求原始吞吐(10k 轮/不同 seed 覆盖),前者用 sanitizer 加持换取"内存/竞态类 bug 在首次触发时就能拿到完整栈"的深度诊断能力。两 pass 均采用两层 timeout 设计:`differential-fuzz.py` 的 `--time-budget-seconds` 是内层 pacing 机制,预算耗尽即停止发起新轮、仍正常输出 `Results:` 汇总(标注为部分覆盖),外层 CI `timeout` 降级为纯 hang 保护(只在进程真正卡死或脚本崩溃时触发)。因此 evaluate step 判定的 incomplete 状态语义单一化:不再包含"慢但健康"的情况,只意味着真实 wedge 或脚本 crash。具体轮数/预算分钟数以 `.github/workflows/daily-sanitized-fuzz.yml` 文件注释为准(禁止在本指南中硬编码,历史标定值已在该文件多次因 runner 吞吐方差重新校准)。
3839
- **Nightly cross-runtime benchmark**`.github/workflows/nightly-benchmark.yml`):每日 22:30 UTC+8 运行 `scripts/bench-cross-runtime.sh`,对比 Go/Java/C++ 三运行时在多维矩阵下的最大吞吐:DAG 规模(默认 `5,50,100,200`)× 存储模式(`row,column`)× 算子类型(`cpu,io,mixed`,对应新增的 `transform_bench_cpu` / `transform_bench_sleep` 与 lua 混合管道)× 可选 fan-out 并行度。仅运行最大吞吐阶段(不再有顺序延迟与固定 QPS=500 阶段)。Job 超时提升为 90min,自动下载上次成功 artifact 并通过 `scripts/bench-compare.py` 生成 delta 报告,`scripts/bench-analyze.py` 提供单次运行的多维度分析(runtime ranking / parallelism effect / storage effect)。完成后通过 Bark 推送通知,运行前停止 runner 上非必要服务以提升隔离性
3940

4041
所有质量检查集中在 CI workflow 中。Release workflow 通过 `workflow_run` 依赖 CI 结果,不重复任何检查。
@@ -146,6 +147,16 @@ CI 中 fuzz 运行时间为 30s/入口,并使用 `-run=^$ -parallel=4` 固定
146147
- **跨存储模式比较**:每个 fixture 自动在 row 和 column 两种 storage_mode 下执行,输出在同一引擎内进行 row-vs-column 等价比较
147148
- **Stabilize sort 条件收紧**:仅在 operator 有非 skip 的 `common_input` 时才附加 skip 字段,避免不必要的 skip 导致非确定性
148149
- **Stratified 报告**:summary 输出 `row=A/B column=C/D` pass/fail 分布 + per-dimension 覆盖计数
150+
- **`--time-budget-seconds`(wall-clock 优雅停止开关)**:默认 0(关闭),CI 模式与 Nightly 模式行为不受影响。非 0 时一旦耗尽即停止发起新轮,仍正常输出 `Results:` 汇总(标注为 `N/M rounds (time budget)` 而非 `M rounds`),使慢 runner 降级为"轮数变少但信号完整"而非丢失整个 pass。当前唯一消费者是 `daily-sanitized-fuzz.yml`(见下)。**改动 `Results:` 输出格式前必须先 grep 所有消费者**(当前含 `nightly-diff-fuzz.yml``daily-sanitized-fuzz.yml` 的 evaluate step),确认改动只在 `^Results:` 前缀之后扩展,不能变动前缀本身。
151+
152+
### Daily sanitized-fuzz(ASan/TSan 深度诊断)
153+
154+
`.github/workflows/daily-sanitized-fuzz.yml` 每日 schedule 运行 pine-cpp 的 ASan+UBSan 与 TSan 两个 sanitizer-instrumented differential-fuzz pass,复用同一份 `scripts/differential-fuzz.py`
155+
156+
- **与 Nightly differential-fuzz 的分工**:Nightly 用 Release 二进制追求原始吞吐覆盖(10k 轮/不同 seed),本 workflow 用 sanitizer 加持换取"内存越界/UAF/竞态类 bug 在首次触发时即可拿到完整栈"的深度诊断能力,二者互补而非替代关系。
157+
- **两层 timeout 设计**:内层 `--time-budget-seconds` 是 pacing 机制,预算耗尽即停止发起新轮并正常输出 `Results:` 汇总;外层 CI `timeout` 降级为纯 hang 保护,只在进程真正卡死或脚本崩溃时才触发。
158+
- **incomplete 信号语义单一化**:evaluate step 判定某个 pass "incomplete"(无 `Results:` 汇总行)现在只意味着真实 wedge 或脚本 crash——"慢但健康"的 runner 已经被内层 budget 兜住,不再落入 incomplete 分支。evaluate step 会从 `Results:` 行 parse 实际轮数(`N/M` 形式)写入 summary 表,使部分覆盖在报告中可见。
159+
- 具体的 schedule cron、ASan/TSan 轮数、in-script budget / 外层 timeout / step timeout / job 超时的分钟数以 `.github/workflows/daily-sanitized-fuzz.yml` 文件本身(含其头部注释的标定依据)为准,禁止在本指南中硬编码——这些数值已因 runner 吞吐方差多次重新校准,注释里记录了数据来源的观测窗口。
149160

150161
### DAG 差异模糊测试(DAG Differential Fuzz)
151162

@@ -279,6 +290,7 @@ Pine-Java 通过 Sonatype Central Portal 发布到 Maven Central(release profi
279290

280291
- CI 配置:`.github/workflows/ci.yml`
281292
- Nightly differential-fuzz:`.github/workflows/nightly-diff-fuzz.yml`
293+
- Daily sanitized-fuzz:`.github/workflows/daily-sanitized-fuzz.yml`
282294
- Nightly cross-runtime benchmark:`.github/workflows/nightly-benchmark.yml`
283295
- Release 配置:`.github/workflows/release.yml`
284296
- Go lint 配置:`.golangci.yml`

llmdoc/index.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
## guides/
2020

2121
- `llmdoc/guides/standard-workflow.md` — 标准工作流程:llmdoc 加载、plan mode 对齐、任务跟踪、逐步验证、文档同步、review-driven scope expansion 接受。
22-
- `llmdoc/guides/ci-quality-baseline.md` — CI 工程质量基线:lint(含 Java checkstyle `failOnViolation=true` + `OneStatementPerLine`、C++ clang-format)/ test / coverage / fuzz / differential-fuzz / cross-validate / nightly cross-runtime benchmark / release-gate 架构与接入约定(含 pine-cpp 的 4 个 CI job 与 cross-validate cpp 二进制注入路径),统一任务入口 Makefile 体系(顶层 + `pine-go/` Makefile 封装跨四语言 fmt/lint/test/bench/codegen/版本管理,CI 与本地共用同一命令序列、`make bench` 默认 `pine_bench` tag),以及本地 `.githooks/` 体系(`pre-commit` staged-only 格式 gate + `pre-push` 工程级 lint + 自包装 CI watch)。
22+
- `llmdoc/guides/ci-quality-baseline.md` — CI 工程质量基线:lint(含 Java checkstyle `failOnViolation=true` + `OneStatementPerLine`、C++ clang-format)/ test / coverage / fuzz / differential-fuzz / daily sanitized-fuzz(ASan/TSan 深度诊断,与 nightly Release 10k 轮吞吐互补,`--time-budget-seconds` 内层 pacing + 外层纯 hang 保护两层 timeout 设计) / cross-validate / nightly cross-runtime benchmark / release-gate 架构与接入约定(含 pine-cpp 的 4 个 CI job 与 cross-validate cpp 二进制注入路径),统一任务入口 Makefile 体系(顶层 + `pine-go/` Makefile 封装跨四语言 fmt/lint/test/bench/codegen/版本管理,CI 与本地共用同一命令序列、`make bench` 默认 `pine_bench` tag),以及本地 `.githooks/` 体系(`pre-commit` staged-only 格式 gate + `pre-push` 工程级 lint + 自包装 CI watch)。
2323
- `llmdoc/guides/investigation-to-fix-testing.md` — 从调查到修复的测试策略:按缺陷类型选择测试层、最小修复面原则、跟进上游 issue 与临时止血方法论(跨 issue 根因归属不顺 follow-up 措辞、临时止血阈值用 probe 实测标定)。
2424
- `llmdoc/guides/cross-layer-validation.md` — 跨层语义校验:JSON 边界类型枚举、codegen 语义验证(含跨引擎 markdown / Python 产物 byte-equal gate)、边界值 E2E、隐含 metadata 契约检测、扩展点对等验证(能力等价)。
2525
- `llmdoc/guides/benchmark-hygiene.md` — Benchmark 噪声卫生:跑前/跑后 load 与残留进程检查、同日同机对照纪律、±5-7% 二进制布局噪声与 perf stat 交叉验证、calibrated stddev 33-36ms 来源校准(DAG 调度抖动 + LuaJ JIT warmup + 网络抖动主导,GC pause 非主要源)、fixture 代表性(calibrated 为性能决策唯一裁判)、microbench 访问模式戒律、逐 op 删除归因法、测量路径对称性(PureVM vs CallOnly vs Boundary 不可互推)。
@@ -108,6 +108,7 @@
108108
- `llmdoc/memory/reflections/wangshu-v020rc3-upgrade-and-workaround-refactor.md` — wangshu v0.2.0-rc3 升级与两 workaround 重构 / 拆除 / 判据迁移复盘(wangshu 内存系列第四篇):上游一次回应 #9/#10/#11 三 issue(#9 真等价解 `MaybeCollectNow` 等三选一 API;#10 真根因解为 arena LARGE freelist 单链 first-fit→power-of-2 buckets,纠正前篇"rehash 风暴"错误推断;#11 partial:`Arena.Compact()` 解 transient peak、bump 不回退、sustained-fat latch 留作 follow-up),下游 cadence-sweep 真拆 / drop-fat-state 判据迁移(`GCCountKB``ArenaCapKB`)/ `makeArrayTable``NewArrayTable`,沉淀两条 rc 升级方法论(必读 issue close comments、workaround 拆除分 root-cause/proxy 判别);本篇覆盖纠偏第三篇 reflection 与稳定文档多处。
109109
- `llmdoc/memory/reflections/redis-cascade-safety-and-observability.md` — Redis cascade-safety 五参数(`{dial,read,write,pool}_timeout_ms` + `pool_size`)三引擎对齐 + pine-cpp Client 失败收敛与 SIGPIPE 守卫 + codegen markdown 跨引擎 byte-equal + per-command Redis 指标(`pine_redis_command_*` 4-state status)的 PR 复盘(13 commits / 3 轮 review),记录 codegen 单向对齐方向(Go 是 source of truth)、failed-path 静默降级审计契约、单元测试不能替代 byte-equal gate、review-driven scope expansion 接受、cpp 错误类型分层 known follow-up 五条教训。
110110
- `llmdoc/memory/reflections/jdk25-upgrade-and-zgc-investigation.md` — 2026-06-26 评估 pine-java 升 JDK 25 + 切 ZGC 的 A/B/C 路径复盘,记录"性能假设要测不要猜"与 deployment-shape vs GC-shape 匹配检查的教训,含 G1/ZGC GC log 实测数据点(G1 max STW 12.82ms 证伪 stddev=GC 假设、ZGC 2C cgroup 下 concurrent 6.7% CPU 偷窃致 −5~7% QPS)。
111+
- `llmdoc/memory/reflections/sanitized-fuzz-time-budget-graceful-stop.md` — daily-sanitized-fuzz.yml ASan pass 连续 8/10 天被内层 timeout 杀死复盘,记录 all-or-nothing 全损结构缺陷(不管差多少轮,超时即全部作废)、预算标定须用观测窗口内 worst 实测而非快日均值标定(快慢日方差达 55%)、长时任务 timeout 应分内层 pacing(`--time-budget-seconds` 优雅降级、保留 `Results:` 部分覆盖信号)/ 外层纯 hang-protection 两层、"若 X 再现则走 Y"式观察窗口决策树若无 owner 跟进执行则形同虚设四条教训。
111112

112113
## memory/decisions/
113114

0 commit comments

Comments
 (0)