Perl 38:发布前把失败阶段拆开测试
只跑一次成功链路,无法排除坏字节被吞掉、旧报表被截断、子进程启动失败却返回成功。当前 Course 审核以输入、解析、查询、写入、子进程与生命周期六类组织故障矩阵,逐项记 exit、signal、STDOUT、STDERR 和目标文件状态。tools/replay.pl --case all 把这些 case 收成一份 JSON:bad-byte、bad-json、directory-output、missing-parent、input-output-alias、output-pair-alias、kernel-faults、input-faults、data-contract、worker-and-lifecycle 都在同一入口下复跑。
成功对照仍然要保留:version 说明实际解释器,import 必须得到 INPUT<TAB>5、ACCEPTED<TAB>4、REJECTED<TAB>1,query-all 的 stdout 必须逐字节等于 accepted JSON Lines,report 必须输出固定排序 TSV。失败对照则看不同阶段:字段语法错误进入拒绝清单,坏 UTF-8 是整批失败;坏 JSON 不能发布新报表,目录输出和缺父目录必须状态 2,非法 level 与负 duration 是参数错误,空导入和空查询仍可成功。错在程序运行哪个阶段,决定诊断应该归谁,不能把所有 STDOUT 空都合并为一种失败。
环境与制品也要入矩阵:精确 5.38.2 复跑使用 /private/tmp/perl-5.38.2-independent/perl-5.38.2/perl;工程测试内派生进程需要绝对 PERL5LIB 才能找到本仓库 LogTool::Report,这一点已单独记录为命令前提。Text::CSV、SQLite、distribution 和并行聚合属于其他篇或其他 lane;本篇不把它们的历史证据当成当前 Course 入口的替代验收。
故障矩阵的空白必须写作 NOT_RUN:断电恢复、恶意文件系统、其他平台、真实生产日志和长期并发压测均没有在本次 lane 中测试。练习:先跑错误输入再拿上一次的 report.tsv 给用户看,能证明本次成功吗?不能;退出码、诊断、生成时机和目标内容必须一起看。详细证据见 completion/evidence/semantics/*replay-all.*、*course-input-faults-test.*、*course-engineering-test-with-perl5lib.*;参考 Perl 5.38.2 pod/perlfunc.pod 的 read/close/rename、pod/perlipc.pod 的进程边界。









