Repository navigation
Releases
Prism Engine V3.0.1
Prism Engine V3.0.1
V3.0 之上的增量版本:点亮 2D 矢量路径光栅的 GPU 通路,并重做光栅算法与若干渲染热点,解析覆盖率精度与速度同时提升。V3.0 及更早(含 V2.5 能力对齐、语言层与观感体系)的完整能力说明见 V3.0 Release,本页只写增量。
本版增量
2D 矢量路径光栅:GPU 通路点亮
- 双端同式:Vulkan SPIR-V compute 与 WebGPU/WGSL compute kernel,与 CPU 扫描线解析覆盖率逐字节一致
- 真接线:
PathMask逐帧全分辨率遮罩接入「GPU 优先 / CPU 兜底」入口,无需再烘焙成位图;无设备时自动回退 CPU - 真机判据:
llvmpipe (LLVM 20.1.2, 256 bits)9 用例 dispatch→fence→readback,differing_pixels=0、两跑逐字节一致;对 f64 精确面积标尺最大差1.79e-7 - 反假绿负控:扰动 kernel 系数使判据 FAIL,证明绿灯来自真实 GPU 执行,而非 CPU 兜底蒙混过关
- 依赖方向保持单向:
postfx → {gpu, raster},prism-raster不反向依赖 GPU
此前这一项在「诚实的边界」里被列为仅 CPU 扫描线,本版销号。
2D 扫描线光栅重写(速度与精度同时提升)
| 用例 | 优化前 | 优化后 | 倍数 |
|---|---|---|---|
| 圆 64 段 1080p | 5.878 ms | 0.225 ms | 26× |
| 星 512 段 1080p | 656.131 ms | 3.541 ms | 185× |
| 星 512 段 4K | 2295.932 ms | 36.900 ms | 62× |
| 星 2048 段 4K | 19914.446 ms | 70.682 ms | 282× |
- 拆掉三处平方级复杂度:列折点不再作为事件、内部列 O(1) 批量加、活跃跨越序增量维护;交点按 x 区间剪枝
- 几何量提到 f64、只在写回缓冲时舍入一次:相对精确面积标尺的偏差从旧实现
5.1e-5降到3e-8(旧实现在 4K 坐标上本身就会丢精度) rasterize_into缓冲复用:星 512 4K35.4 → 13.6 ms、星 2048 4K67.9 → 46.0 ms- 341 组对拍(288 组对精确面积标尺 + 53 组对旧实现),含自交、孔洞、双填充规则、退化、260 组固定种子伪随机多边形;最大绝对差
4.17e-7 - 负控:把梯形积分系数
0.5改成0.51⇒ 8 个测试立即 FAILED,证明对拍没有空转
其他渲染热点(不局限在 2D 光栅)
mean_samples(spp=16)134.19 → 57.94 ns/px(2.3×):消除每像素Vec分配Bsdf::eval71.51 → 62.63 ns:引入轻量求值预算- 均有逐位对拍(
n=0..=128全等、234090 组Vec3逐位全等)
工程
- 全量测试 4629 passed / 0 failed / 0 ignored(239 个测试段)
spv_freshness5/5;wasm 748,758 B < 786,432 B 上限;Cargo.lock第三方依赖计数 0- 单文件分发包:789 个文件 / 22.1 MB,解包回环 789/789 逐文件逐字节一致
分发与校验
- 仓库根目录只保留最新版单文件包
prism-engine-v3.0.1-source.txt;v3.0 及更早版本的包归档在各自历史 Release 的 Assets 中,未删除 SHA256SUMS.txt累计四行(v2.1 / v2.2 / v3.0 / v3.0.1),四行哈希全部与各自 Release asset 逐字节相符;本版 digest9c1177e5…- 只下载本版包时,按当前版本过滤校验,避免历史行因文件不在本地而误报:
curl -L -O https://github.com/Qianjinqie/prism-engine/releases/download/v3.0.1/prism-engine-v3.0.1-source.txt
curl -L -O https://github.com/Qianjinqie/prism-engine/releases/download/v3.0.1/SHA256SUMS.txt
grep 'v3.0.1' SHA256SUMS.txt | sha256sum -c -升级
从 v3.0 升级:取本版单文件包,按 README「三分钟跑起来」还原即可。场景语义不变——首行 // prism-dsl 2 仍走 V3.0 语言前端,无版本头或 // prism-dsl 1 仍走 v2 路径、产物逐字节不变;旧 .prism 文件行为完全兼容。
Prism Engine V3.0
Prism Engine V3.0 — 能力对齐 + 语言层与观感体系
本版是两部分合起来的交付:V2.5 的能力对齐(此前只在代码库里,没有单独发版、也没有任何对外说明)与 V3.0 的语言层与观感体系。
如果你只跟过 v2.2,下面第一节就是这两版之间补掉的全部能力。
一、V2.5:能力对齐(未单独发版)
目标只有一个:把「能不能做」这个问题结清。结清之后不再回答,回到引擎本心。
渲染
- 位图纹理管线:UV + 双线性 / 三线性 + 7 级 mip + 法线 / 粗糙度贴图 + sRGB 解码。双线性 4096 采样点 0 ulp,7 级 mip 链斜视 0/3072 像素差,sRGB 往返 ≤0.5/255,CPU↔Vulkan 三档 0/3072
- HDR 环境光 / IBL:环境重要性采样 + MIS。与参考实现偏差 0.325%(split-sum 近似为 26.424%);设备白炉 1024 样本 ≤1e-2、8192 样本 ≤5e-3
- 几何实例化:112 B 实例槽 + 局部 BLAS + 法线
det(A)·A⁻ᵀ·n回世界空间。1 万实例与 CPU 权威逐位一致;Vulkan llvmpipe0/256、浏览器 WebGPU0/256 - 细分曲面 + 位移贴图:Catmull-Clark 极限 stencil 三个解析值 ≤1e-6;位移在烘焙期与运行期两条通路都已闭合,不是只在离线烘焙里有效
- 逐像素自适应采样:方差引导 + 收敛判据 + 迭代精化;同画质下采样数 0.9175×
- 多层参与介质:互斥区域 + 优先级全序,均匀与异质网格(delta tracking)都支持;白炉 τ≤0.2 最差 5.334e-5,CPU↔wavefront
0/108 - 毛发几何:毛股曲线 + 按股标架 + 曲线 BVH 合流 + 按 f 的 Marschner 采样器(∫pdf dω = 0.999999955,白炉相对差 8.181e-5)
格式与工作流
- OCIO 配置:自研
config.ocio解析(colorspaces/roles/displays+views/looks+ 六类 transform),烘焙成 Q24 定点 1D shaper + 3D cube LUT,纯整数求值、零 libm;17³ 网格点上 LUT 与直接求值最大偏差 3.590e-7 - USD 完整度:真解析二进制
.usdcCrate(TOC / LZ4 / value rep)+.usdz解包,不再只认 USDA 文本 - MaterialX 完整度:21 种节点 / 45 别名 / 17 个 BSDF 槽,节点图可编译成 BSDF
- 实时预览视口:预览就是同一套路径追踪器的低预算档,不是另写一套;静态图与预览帧逐字节相同
明确不做(已裁定,理由写在这里)
- 桌面 WebGPU 单独验证:软件适配器 + 2 台 Adreno + 3 个浏览器实测已经足以证明代码路径,重复验证无增量
- 额外的容器 / 编码桥:内置 MJPEG-in-MP4/AVI 与 EXR / PNG / JPEG / DNG 已零依赖自包含、永远能出片;需要别的容器,用 FFmpeg 几秒转封装即可,不值得为它自研编解码
- 灯端口 / 路径引导 / 光子映射:三项分别被 MNEE、立体角 2D CDF + MIS、NEE + MIS 覆盖,再实现一遍不增加画面能力
未点亮(缺真机,一律不写「支持」)
| 项 | 缺什么 | 什么时候复验 |
|---|---|---|
| Metal(iOS / macOS) | 无 Apple Silicon / macOS 设备 | 取得任意 M 系列设备即复验 19 项 |
| 硬件编码(NVENC / QSV / VAAPI / VideoToolbox) | 无对应真机 | 取得任一硬件编码器 |
| ARM Mali / PowerVR | 现有覆盖只有 Qualcomm Adreno 640 / 619 | 取得 Mali 或 PowerVR 设备 |
能力矩阵终态:39 项中,除上表 3 项缺真机、2 项明确裁定不做外,其余全部对齐;「部分」0 项、「缺失」0 项。
二、V3.0:语言层与观感体系
V2.5 把能力补齐,V3.0 把「能力能不能被写出来、写出来像不像人搓的」这两件事做完。
语言层:每一项能力都能从语言层写出来
- 单文件形态:一部片子 = 一个
.prism文件,资产以内容哈希锁定,缺资产结构化报错带行号 - 自研 LL(1) + Pratt 前端(零第三方解析库):缩进块、表达式、变量、
def、for/if、列表 / 字典字面量、字符串插值、全链路行号报错 - 确定性受限子集:种子是一等字段且进产物哈希;
det_*零 libm 标量函数;求值顺序固定、换序可检出;不做图灵完备 - 39 项能力触达 100%:226/226 参数从 DSL 可达——第一节里那些能力(纹理 / IBL / 实例 / 细分 / 位移 / 介质 / 毛发 / 自适应 / OCIO / USD / MaterialX)全部可从语言层写出,不用回到 Rust
- 七族旧拒绝项全部销号:
particles/sim/compose/morph/light/audio/post不再拒绝 - 任意参数时序驱动:统一命名通道按帧 / 关键帧驱动任意参数,逐帧值可断言
观感体系:画面不像代码生成
finish = analytic | crafted双一等档:进产物哈希,漏填即静态报错;匀质是合法交付物,不是失败——用户要均匀就选analytic- 六族痕迹注入生成源头(运动 / 几何 / 材质光照 / 时间镜头 / 构图色彩 / 剪辑音画):在
movie.rs组装材质光源之前消费,不是出帧后贴 grain - 两条禁令做成静态门禁:痕迹挪到帧后贴皮 ⇒ FAIL;用真随机替代种子化噪声 ⇒ 两跑字节不一致 ⇒ FAIL
- 盲测 64/64(门槛 0.75),判官为确定性可计算函数且真盲(
b_first由hash_mix打乱);反假绿负控 0.4375 证明判官不是无条件选 B - 客观侧证:
prism-aesthetic五维 critic 总分降 0.099999,在冻结容差 0.25 内(画质不退化)
工程
- 全量测试 4580 passed / 0 failed / 0 ignored,29 crate,0 第三方依赖
- 三后端一致(CPU / Vulkan-SPIR-V / WGSL),确定性两跑逐字节
- 单文件包:779 个文件 / 21.9 MB(下方 Assets;仓库根目录始终只放最新版,现为 v3.0.1)
⚠️ 校验文件修正
v2.2 的 SHA256SUMS.txt 记录的 v2.2 包哈希有误(d2b4e919…),与 asset 实际内容(b10fb669…)不符,
当时 sha256sum -c 会报 FAILED。本版已修正,SHA256SUMS.txt 三个版本的哈希全部与 release asset 逐字节相符。
升级
从 v2.2 升级:取下方 Assets 里的本版单文件包,按 README「三分钟跑起来」三步还原即可。仓库根目录只保留最新版分发包(现为 v3.0.1),历史版本一律在各自 Release 的 Assets 中归档。
旧 .prism 文件按 // prism-dsl 1 版本语义恒等 analytic,行为不变、逐字节同帧。
Prism Engine V2.2
Prism Engine V2.2 — 真机验证版
V2.1 之后的正式发行版。主线是把「只在软件适配器上验过」的 GPU 路径拉到真机上跑通,
并修掉真机暴露的三处缺陷;同时结清四项能力扩容。
⚠️ 升级提示:v2.1 单文件分发含已知缺陷
prism-engine-v2.1-source.txt(打包于 2026-10-27,早于修复提交 5b8ded4)包含 BSDF 多散射补偿缺陷:
Disney BSDF 的补偿采用「逐通道各自 F0 查表回填」,低 F0 通道被过量放大,补偿幅度不随 F0 单调。
表现为高饱和金属(金、铜)在低粗糙度、掠射角下整球偏成补色(金球发青绿)。
实测量级(金 f0=1.000/0.766/0.336,α=0.05、μo=0.25、μi=0.25):G 通道旧/新 3.85×、B 通道 18.92×,
极端掠射(μo=0.1、μi=0.8)B 通道达 49.83×。
v2.2 已修:改为 Fdez-Agüera 2019 彩色导体形式——幅度取白炉表(F0=1),色相由半球平均 Fresnel 承担。
关注掠射角补色一致性的用户请升级。
主要变更
流 A · 缺陷修复(真机暴露 + 测试盲区)
- GI 存储布局去
vec3<f32>依赖——真机驱动对结构体成员vec3<f32>的size处理与 WGSL 规范不一致(规范size=12/align=16),导致GiProbe.normal读到samples哨兵-1、后续字段整体错位。四个布局结构体全部改vec4<f32>(布局零变化:GI_*_STRIDE_BYTES一个字节未动,第 4 分量恒 0 不参与运算)。新增gpu.gi_layout作为真机判读锚点,并加两侧静态门禁(WGSL 存储布局禁array<vec3<f32>>)。 - GI SDF 球分支修正——
return q.x实为|p.x−c.x|−r(沿 x 的无限大板),不是球 SDF;射线沿 y/z 前进时梯度恒 0,能否在 48 步内跨过t_max取决于浮点舍入累积。CPU 与 WGSL 同步改为|p−c|−r;容量填充图元改为radius 0 + center(0,−1e6,0),即使计数被误读也绝不命中。 - 折射界面法线朝向 + Fresnel 余弦口径——介质内出射时法线未翻转,
refract_dir返回折回介质内部的伪方向,cos_v被钳成 0 导致p_reflect≈0.999恒走全反射。表现即「玻璃球是不透明遮挡体、ior 零效应」。修复后ior 1.0/1.5/2.5由三帧逐位相同变为色心分离 2.504 px(阈值 1.0,cauchy_b=0对照组 0.917 px 证明判据有效)。 - Disney BSDF 多散射补偿形式(见上方升级提示)。
三项均未通过放宽容差 / 改判据 / 加
#[ignore]/ 删测试来「转绿」。F32_TOL仍 2e-6。
流 B · 能力扩容
- 曲线图元可渲染——圆柱 / 圆锥 / 圆环 / 旋转曲面四类解析图元此前不可渲染(场景只有球 + 灯各 8 槽)。新增弦高受控三角化(
hausdorff_bound = r_max·(1−cos(π/seg)))+ 扁平 BVH,同时接通三条路径:CPU 参考、Vulkan megakernel(参数块 22→24 字、绑定 4→6、双栈 BVH 遍历、Möller–Trumbore)、WebGPUscene_frame.wgsl(栈式遍历)。lavapipe 硬判据:四图元全部max_channel_delta=0 && differing_pixels=0。场景 ABI 升 V2(6 绑定),输出恒为末位。 - 材质库扩至十余种 + GGX 各向异性——
MaterialKind由 4 变体扩至 ≥10 预设;principled 新增各向异性(能量补偿闭式近似、无迭代),α_t==α_b时与各向同性 GGX 逐位一致;DSL 老 3 字段场景输出逐位不变。 - SVGF 空域降噪第二阶段——G-buffer 引导时域重投影(motion vector 闭式给出,不用光流、不引第三方)+ 方差引导 à-trous(保持有理核、零超越函数)。静态相机 + 静态场景下累积与「帧 0 起重放」逐字节一致;动态场景 PSNR 43.4 dB(判据 ≥40),同等画质 sample 数下降 91.7%(判据 ≥50%)。
- 光谱渲染切片——采样维度新增 λ 轴,自研 CMF 分段有理式拟合(零 crate、零超越函数),RGB↔光谱升采样;单波长 + 恒定谱反射率下与 RGB 路径逐字节相等。
流 C · 真机 WebGPU 验证(本版主线)
| 轮次 | 设备 / 浏览器 | wasm | 结果 |
|---|---|---|---|
| 1 | 真机(SamsungBrowser 30.1 / Chromium 143 内核) | 423,855 B | 16 PASS / 1 FAIL(旧版,暴露病态球 SDF) |
| 2 | 三星 SM-G9730 / Android 12 / Quark 10.18(Chrome 144 内核) | 439,539 B | 17 PASS / 1 FAIL(旧版,暴露 vec3 布局错位) |
| 3 | 三星 Galaxy S10(骁龙 855 / Adreno 640)/ Quark | 453,223 B | 19 PASS / 0 FAIL |
| 4 | 荣耀 X40(骁龙 695 / Adreno 619) | 453,223 B(同一份字节) | 19 PASS / 0 FAIL |
| 5 | Edge for Android 153 | 453,223 B | 19 PASS / 0 FAIL |
| 6 | SamsungBrowser 30.1(Chromium 143)/ 新产物 ?v=8772008b |
453,239 B | 19 PASS / 0 FAIL |
合计 4 个浏览器环境、2 台设备、2 个产物版本,各 19/19 全 PASS。
第 3、4 轮用同一份 wasm 跑在两台不同档位的设备上,排除「针对某台设备调参」。
第 6 轮首次完整采集到 adapter:vendor=qualcomm / architecture=adreno-6xx /
isFallbackAdapter=false / subgroup 64·128(SwiftShader 为 4·4)——硬件适配器由此直接确认,
不再依赖推断。gpu.scene_frame PSNR 52.5 / 52.9 dB,双跑逐位一致。
方法论结论:「CPU 参考 vs GPU 镜像」的自洽对拍,只有在两端算法本身正确时才有判别力。
两端同错时它恒绿,且 SwiftShader 与 CPU 浮点行为接近,永远无法暴露——只有真硬件 GPU 能。
推论:判据建立在「两端一致」上的测试项,必须至少有一条真机证据。
质量门槛
| 项 | 结果 |
|---|---|
| 全量回归 | 4029 passed / 0 failed / 0 ignored(188 测试段,release,全核并行 110s) |
| 构建脚本 | build.sh 429 passed / 0 failed |
| 零第三方依赖 | Cargo.toml / Cargo.lock 无外部 crate(全部 path 依赖) |
| wasm 体积 | 453,239 B(上限 458,752 B,余量 5,513 B) |
| WebGPU harness | SwiftShader 19/19;真机 19/19(见上表) |
| 打包回环 | 664 文件逐文件逐字节一致 |
| 反假绿 | 幽灵写入防御 / 卫生扫描 / 合规自检 / 全仓零 #[ignore] |
包信息
- 文件:
prism-engine-v2.2-source.txt(664 文件 / 18.61 MiB / 19,518,616 字节) - SHA-256:
b10fb669581edf30c6590fe2b4ef78704dcdad27bf481595b251febb948bb13c - 解包:取 TXT 内
UNPACK SCRIPT BEGIN/END之间的脚本存为unpack.cjs,运行node unpack.cjs(Node 18+) - 验证:
cargo test --workspace --release→ 4029 passed / 0 failed
已知边界(诚实口径)
- WebGPU 真机覆盖仅移动端:4 个环境全为 Android,桌面 Chrome/Edge 零实测——桌面后端不同(D3D12 / Metal vs Vulkan / GLES)。README 边界行维持「限 Chrome/Edge」,不写「WebGPU 已支持」。
- GPU 覆盖仅 Qualcomm Adreno 两代(640 / 619)——正确说法是「跨两代 Adreno 驱动」,不是「跨 GPU 厂商」。ARM Mali / PowerVR 未覆盖,是当前实质性缺口。
- 其余三轮
adapter未采集,其硬件性属推断而非观测;本表只对第 6 轮作直接确认。 - Metal 后端不点亮、
is_available()恒 false,metal/退为历史资产,不引入任何第三方翻译层。 - 硬件编码只到「绑定就绪」档(VAAPI 符号表 +
dlopen结构化Unsupported),不声称可编码。 - DNG 合成交叉矩阵全绿,真实机型未经样本验证。
- 异质体积仅支持单介质盒;光追为多弹射间接光——混合路径积分器默认 4 弹射(
WF2_MAX_BOUNCES),GiProbe/CPU 求解 6–12 弹射、SDF-GI 可至 16 弹射,并含 Russian-Roulette 路径终止,非单步近似。
English summary
Prism Engine V2.2 pushes the GPU path from software adapters onto real hardware and fixes the three defects that only real devices could expose: a vec3<f32> storage-layout assumption that Android drivers violate (size=12/align=16), a broken sphere SDF branch returning q.x (an infinite slab, not a sphere), and unflipped interface normals turning glass into an opaque occluder with zero ior effect. It also lands four capability expansions: analytic curve primitives (cylinder/cone/torus/lathe) across CPU, Vulkan and WebGPU; a 10+ material library with GGX anisotropy; SVGF stage two (temporal reprojection + à-trous, PSNR 43.4 dB, 91.7% fewer samples); and a spectral rendering slice with a hand-rolled CMF rational fit. Verification: 4029 tests pass, wasm 453,239 B, and the WebGPU harness reaches 19/19 on real hardware across 4 browser environments and 2 devices — all Android, all Qualcomm Adreno, desktop still unverified. Single-file TXT distribution: 664 files, 18.61 MiB, SHA-256 b10fb669…8bb13c.
Prism Engine V2.1
Prism Engine V2.1 — 长尾收口版
V2.0 之后的第一个正式发行版。五个长尾缺口按「一重两轻」三路结清,质量门槛全绿。
主要变更
流 A · GPU 渲染管线(重)
- Vulkan
render_scene光追管线真实化:自研发射器生成光追 megakernel(主射线 + 球/灯动态循环 + aesthetic 后处理槽),lavapipe 实机出帧; - 与 CPU 参考 逐字节 0 差异(64×48 / 113×47),GPU 双跑逐位一致;
is_available()升级为 compute ∧ render 双自检(「可用却出空帧」被测试排除);- Metal 同构移植 + 编译门控(未实机验证、不点亮);WebGPU 可行性结论(4–6 人日,无渲染路径)。
流 B · 资产判据与签名闭包(轻)
- USD 资产 R1 同构保持判据 + R3 Hausdorff 保真度界(≤ √3/2·h),R2 字节往返不动点不回归;
- 签名闭包 S3 收尾:迭代节点键含
(ε, n)、流节点键含 frame、S4 逐出中性;None时逐字节退化为旧键(零回归)。
流 C · 长尾盘点 + 异质体积 + T4(轻)
- #10 渲染特性长尾按 K1 三元组盘点成文(K 核 / σ 求逆策略 / d 采样维度),收敛判据可机械判定;
- 异质体积(Woodcock delta tracking)接入 integrator / wavefront 双渲染路径;σt 恒定场与均匀实现逐位一致;
- T4 色彩债务结清:sRGB↔ACEScg 矩阵按官方 AP1 原色 + Bradford(D65→D60) 重录,逆阵 f64 精确重算;旧 Hill 拟合值保留为
SRGB_TO_ACESCG_FITTED_HILL显式可选口径; - 2 条 C15 渲染行为变化登记(T4 矩阵、BakedSdf brick 边缘插值修复)+ 1 条能力扩容清单。
质量门槛
| 项 | 结果 |
|---|---|
| 全量回归 | 3929 passed / 0 failed / 0 ignored(179 测试段,release,全核并行 171.5s) |
| 零第三方依赖 | Cargo.toml / Cargo.lock 无外部 crate(全部 path 依赖) |
| 打包回环 | 642 文件逐文件逐字节一致 |
| 解包树构建 | cargo check --workspace --release 通过 |
| 反假绿 | 幽灵写入防御 / 卫生扫描 / 合规自检(9/9 + 反向自证 8/8)/ 全仓零 #[ignore] |
包信息
- 文件:
prism-engine-v2.1-source.txt(642 文件 / 18.06 MiB / 18,939,405 字节) - SHA-256:
a7919e2b390c64ea04a70eb0fcd8fe283ff5a2d04c3f168d4367b7bbc9493c32 - 解包:取 TXT 内
UNPACK SCRIPT BEGIN/END之间的脚本存为unpack.cjs,运行node unpack.cjs(Node 18+) - 验证:
cargo test --workspace --release→ 3929 passed / 0 failed
已知边界(诚实口径)
- Metal 后端未实机验证、不点亮;WebGPU 无渲染路径;
- 异质体积仅支持单介质盒,无多区域嵌套 / 介质边界折射;
- 真实 DNG(
Compression=7,lossless JPEG)仍不可读;视频编码仍走 ffmpeg 协作 / 硬编探测链; - 硬件 GPU 上的加速比需在目标环境实测——本版 GPU 判对在 lavapipe 软件 ICD 上完成;
- 光追只做一步间接光,无全局多次弹射。
English summary
Prism Engine V2.1 closes five long-tail gaps: Vulkan ray-traced scene rendering with byte-identical CPU parity, USD R1/R3 asset criteria, S3 signature closure, heterogeneous volume wired into both render paths, and the T4 color-matrix debt settled (official AP1 primaries + Bradford, f64-exact inverse, legacy Hill matrix preserved as an explicit opt-in). 3929 tests pass with zero third-party dependencies. Single-file TXT distribution: 642 files, 18.06 MiB, SHA-256 a7919e2b…493c32.