1.13.3
- 修 1.13.2 没生效的 worker 上限：配置文件加载阶段把 workers.count 钳在 1-64
  （沿用旧值 + 记一条说明），而校验函数里的新上限 1-256 永远看不到这个值 ——
  实测在真机上把 count 改成 128 保存，接口回"已保存并重新加载"，但实际仍是 2。
  现在上下限抽成 spec.WorkersMin / WorkersMax 一处定义，加载与校验共用；
  新增测试同时钉住"128 原样保留、999 沿用旧值且有说明、加载结果能过校验"。

1.13.2
- 工作线程数上限从 64 放宽到 256：插件也部署在 128 核的机器上，64 线程把引擎
  卡在硬件之下（仍是合理性边界，不是推荐值 —— 家用路由远在到达上限前就先 CPU 瓶颈了）。
- readme 增加「全灭」模式的推荐配置与实测开销（约 17000 包/秒·核），并写明该模式
  能拦什么、拦不住什么：非 TLS 的全加密流量与 SSH 能拦；TLS 伪装的 Trojan / VMess
  按设计豁免（否则会误杀全部 HTTPS）；UDP 不处理（fet 只处理 TCP）。

1.13.1
- 识别范围警告补上「更省 CPU」的改法：不必把全部流量都拉进插件，可以 ikuai.scope=full
  配 ikuai.queueOnly=custom + ikuai.queuePorts（如 "53,80,443" 或某协议的服务端口），
  只让这些端口的流量进插件 —— 内核不再替这些端口做判断，于是插件能看到流的开头，
  载荷类规则就能生效。1.13.0 的警告只给了"全量接管"一条路。
  已在真机确认该组合生成的队列规则只含端口条件（不含 appmark/ikverdict 限制）。

1.13.0
- 修一个"开了但不会生效"的静默失效：识别范围为「辅助增强」时，依赖报文载荷的拦截
  规则根本不会命中，而界面上完全看不出来。现在会明确提示：
    * 面板顶部显示黄色警告条，列出受影响的规则名，并说明改法（改成「全量接管」）。
    * 启动日志里同样打印一条带 ⚠️ 的说明。
    * /api/rules 新增 warnings 字段。
  原因：辅助增强只把「内核未分类」的报文交给插件，而内核是在一条流开始带载荷之后
  才给它分类的 —— 于是这类流只有握手报文会到插件。域名 / SNI / Host / 协议屏蔽都
  要靠载荷才能判断，因此永远匹配不上。
  只对「拦截」类规则报警：只记录不拦截的规则不报警（默认安装不会挂常驻警告），
  IP / 端口这类不依赖载荷的规则也不报警。

1.12.0
- 配置文件位置改到持久分区：/etc/log/opengfw/config.yaml 与 /etc/log/opengfw/rules.yaml。
  原来在 /etc/opengfw，那属于固件分区（实测只有 129MB），固件升级或恢复出厂会把配置抹掉。
  升级时自动迁移：老位置的文件会被复制到新位置并逐字节校验，确认无误后才删除原文件；
  新位置已有文件时不覆盖。迁移会在启动日志里说明。
  另外处理了一个升级陷阱：应用设置里的路径是安装时一次性写入的，升级不会更新，
  所以老安装启动时仍被指向 /etc/opengfw；该路径现在会在读取时自动重定向到新位置
  （只针对恰好等于老默认值的路径，自己改过的路径不动）。
- 「原生配置预览」新增「重置为出厂设置」：把该文件恢复出厂内容。
  重置 rules.yaml 会同时清空面板上配置的规则（否则面板会显示一批不在文件里的规则）；
  重置 config.yaml 会把拦截恢复为关闭。两项都会先确认再执行。
- 发布闸门新增：默认路径必须在 /etc/log 下、迁移与重置逻辑必须存在、重置端点必须注册。

1.11.0
- 「原生配置预览」现在可以直接在面板里编辑并保存（原来只能看）。
  两个文件（config.yaml / rules.yaml）各自有「编辑 / 保存 / 取消」；保存先过校验：
  配置文件要能解析成有效设置（例如 log.level 只能是 debug/info/warn/error），
  规则要能被引擎编译。不通过就不写盘，并把原文件还原、把引擎的错误原文回给你，
  所以贴坏内容不会把插件弄成起不来的状态。保存成功即时生效（热加载）。
  上游那份面板的这块本来是只读的，编辑功能是本插件加的（独立脚本，上游前端保持原样）。

1.10.0
- 管理面板换成上游 OpenGFW 面板的前端（ccqwertyui/luci-app-opengfw），本插件自研面板退役。
  为什么：自研面板是与上游并行的第二套界面与第二套参数定义；上游那套是现成的、功能更全的
  中文界面（域名/IP/端口规则、屏蔽、流量透视、实时日志、环境诊断、规则仿真测试）。
  做法：把它的前端资产（index.html / css / js / i18n）原样内置进本插件，并按它前端实际调用的
  21 个 /api/* 端点实现后端 —— 底层是**本插件自己的引擎**，不是上游的 dashboard 二进制。
  为什么不直接跑上游的 dashboard 二进制：它在启动引擎前检查 /sys/module/nft_queue，
  而 iKuai 把 NFQUEUE 编进内核（不是模块），该前置条件在本固件上永远不成立（实测被拒）；
  它还会用 nftables 自己写防火墙规则，而 iKuai 没有 nftables。
- 调度方式沿用本插件的「内核优先」：内核 DPI 先判，只有内核未能识别的流量才进入本插件队列
  （爱快自身的 appmark/ikverdict 语义），与云防火墙那类内核调度一致，不是把全部转发流量
  都搬到用户态。
- 面板的规则模型（域名/协议开关、IP、端口、屏蔽）由本插件翻译成引擎的表达式规则：
  域名按 DNS 名称 / TLS SNI / HTTP Host 分别生成，子域用 hasSuffix（DNS 名称带末尾点、
  SNI 与 Host 不带，写错就会静默不命中）；生成的规则经引擎编译器校验通过才落盘。
- 面板生成的规则写在 rules.yaml 的标记行之后，标记之前的操作者规则**逐字保留**（含注释与
  格式），面板只重写自己那一段。
- 面板里的「DNS 污染」「反诈 HTTP 跳转」以及屏蔽的「仅记录」模式，本引擎没有对应实现：
  设置会被保存但**在面板上明确说明不生效**，不会假装生效。
- 「安装内核模块」按钮在本固件上如实回答「NFQUEUE 已内建」——上游那一版正是卡在这里。
- 环境诊断给出 iKuai 实际相关的检查项（NFQUEUE 内核接口、iptables 可读性、挂载一致性、
  当前调度方式），只诊断不改内核。
- 原始配置编辑（config.yaml / rules.yaml）保存前先校验，内容非法则拒绝并**还原原文件**。
- 本插件自己的 /api/v1/* 保持不变：发布闸门与验收脚本用它，且它带有面板放不下的字段。
- 面板头部的版本徽标改为显示**本插件**的版本（原来显示上游 dashboard 自己的 v1.1.2-14）。
- 面板总览的统计磁贴接上真实数据，不再恒为 0：
    * 「总分析包」= 内核交给本插件的报文数（读 iKuai iptables 规则自带的 -c 计数，
      读不到时不显示 0 而是保持 0 并在 status 里以 queue_counters_ok 标明"未测到"）；
    * 「已拦截流量包」= 引擎的拦截判定数（本引擎按流判定，用户态拿不到逐包拦截数，
      因此这里给的是判定次数，不是编造出来的包数）；
    * 「全加密代理 / Trojan / SSH」等卡片 = 引擎识别并命中的次数。
  计数在日志等级门禁**之前**累加：否则把日志调到 warn 就会让面板数字变成 0，
  看起来像"没有流量"，这是最坏的一种错。
  说明：fet（全加密流量）无法区分裸 VMess 与 Shadowsocks，两者合并计入
  「全加密代理 (SS / 裸 VMess)」这一张卡，不编造拆分。

1.9.0
