A_Pair v1.1.0 Release
概述
v1.1.0 是一次重大架构升级,重新设计了座位分配策略系统,新增插件多策略包支持,并进行了全面的代码质量提升。共 140 个文件变更,49 个提交。
🏗️ 策略管道重构
双轨制架构
策略系统从单一管道模型升级为独立策略 + 依赖策略双轨制:
- 独立策略 (
ISeatingStrategy) — 在外部管道中按 Priority 降序执行,负责通用填充逻辑 - 依赖策略 (
IDependentSeatingStrategy) — 在 RandomFill 的每次随机分配循环内评估,支持 Approve / Reject / Handled 三态响应
新增 3 个策略
| 策略 | 类型 | 功能 |
|---|---|---|
| 性别限制座位 | 依赖 | 座位级性别限制,不匹配时自动重定向到匹配空座 |
| 同桌不重复 | 依赖 | 基于历史快照防止过去同桌再次相邻 |
| 碎片整理 | 独立 | 后置处理,将后排无约束学生前移,减小座位分散度 |
DeskMate 同桌策略重写
从独立策略改为依赖策略,新增三级协调分配:
- 层级 1 — 相邻空座充足 → 直接分配全部组员
- 层级 2 — 空座不足 → 腾挪相邻非固定占座者,释放座位
- 层级 3 — 腾挪后仍不足 → 部分分配 + 警告,不再拆散
🔌 插件系统重写
多策略插件包
从单清单架构升级为双层清单:
Plugins/{packageId}/
├── plugins-manifest.json ← 包级清单
├── strategy_a/
│ ├── manifest.json ← 策略元数据
│ └── strategy.dll
├── strategy_b/
│ ├── manifest.json
│ └── strategy.lua
└── data/
└── enables.json ← 运行时启用状态
新功能
- 包级 + 策略级独立启用/禁用
- 热加载/卸载单个包
- 插件配置通过
PluginPackageConfigService读写 - ZIP 安全防护(条目数/压缩比/路径遍历检查)
🧠 历史感知
两个新的历史加载器使策略支持跨会话记忆:
- 前排轮换历史 — 从快照恢复学生的前排座位历史,惩罚权重跨会话生效
- 同桌不重复历史 — 提取过去快照中的同桌对,防止重复相邻
🖥️ UI 增强
- 策略配置页重构:独立/依赖策略分组展示,竖线层级指示器
- 新增加载中遮罩、参数编辑器、代码块编辑器
- 座位安排页新增加策略消息面板(错误/警告可折叠)和修改历史时间线
- 全面采用 C# 13 partial 属性语法
🔧 代码质量(Review 阶段修复)
| 类别 | 数量 | 要点 |
|---|---|---|
| 正确性 | 6 | CircularHistory 去重、配置读写路径统一、TryAssignSeat 历史参数、await 化保存 |
| 安全 | 2 | ZIP 路径遍历防护(PluginManager + SDK) |
| 性能 | 2 | JsonSerializerOptions 静态池(消除 14 处分配)、GetStrategiesAsync 30s 缓存 |
| 分析器 | 40+ | CA1816 / CA1869 / CA2016 / IDE0059 / IDE0060 / IDE0075 / IDE0350 / MVVMTK0042 |
| 测试 | +1 | 新增 ZIP 路径遍历安全测试 |
📊 统计
| 指标 | 数值 |
|---|---|
| 文件变更 | 140 (+8495 / -2455) |
| 提交数 | 49 |
| 新增策略 | 3(Defrag / GenderRestrictedSeat / NoRepeatDeskMate) |
| 重写策略 | 2(DeskMate / RandomFill) |
| 新增 ADR | ADR-007(多策略插件包) |
| 测试总数 | 335 |
| 测试通过率 | 100% |
| 构建警告 | 0 |
⚠️ 破坏性变更
- 插件清单格式从
plugin.manifest.json改为plugins-manifest.json(旧格式不被识别) IPluginSeatingStrategy新增默认接口实现(Category / Version)ISeatingStrategy.Priority语义反转(高=先执行)DeskMateStrategy从独立策略改为依赖策略(不再在管道中独立运行).apairplugin扩展名改为.ap-plugin
🔄 升级指南
- 如有旧格式插件,需迁移到新的双层清单结构(参见
docs/adr/ADR-007.md) - 如自定义策略依赖 Priority 值,需反转:旧
Priority=10(先执行)→ 新Priority=90(先执行) - 所有 JSON 文件版本号已更新,打开后自动迁移
下载注意事项
版本选择
每个平台提供两种版本,文件名格式为 A_Pair-{类型}-{平台}:
| 后缀 | 类型 | 体积 | 前提 |
|---|---|---|---|
-sc- |
自包含(Self-Contained) | ~100 MB | 无需安装任何运行时,开箱即用 |
-fd- |
依赖运行时(Framework-Dependent) | ~20 MB | 需安装 .NET 10 运行时 |
文件名示例:
A_Pair-v1.1.0-self-contained-win-x64-unsigned.exe= 自包含版 · Windows 64位 · 无需装 .NET
程序未签名
当前版本尚未进行代码签名,运行时可能遇到以下情况:
- Windows:双击后 SmartScreen 弹出 "Windows 保护了你的电脑" 警告。点击「更多信息」→「仍要运行」即可。
- macOS:首次打开时提示 "无法验证开发者"。前往「系统设置 → 隐私与安全性」→ 点击「仍要打开」。
- Linux:下载后需手动赋予执行权限:
chmod +x A_Pair-sc-linux-x64-unsigned && ./A_Pair-sc-linux-x64-unsigned
后续版本计划申请代码签名证书以消除这些警告。
使用方式
- 将下载的单个可执行文件放入一个空文件夹
- 直接运行即可(程序会在同目录创建
AppData/存放配置和数据)
下载后请校验哈希值
| 文件 | SHA256 |
|---|---|
A_Pair-v1.1.0-framework-dependent-linux-x64-unsigned |
c4f710b52f346231274cbff0f3f52d854dd8232a9c672d6e7e6ee908012c4ad6 |
A_Pair-v1.1.0-framework-dependent-osx-arm64-unsigned |
76af34ec5b75f158fd202cd4032498d74b59459333385669d7b7cb5546585cbd |
A_Pair-v1.1.0-framework-dependent-osx-x64-unsigned |
b4273c78378249c82c45479fb5771fc89baf4f3bcaab31630083f0ef61cb2473 |
A_Pair-v1.1.0-framework-dependent-win-x64-unsigned.exe |
8fd8b3616f0247dfae061c027cf7ba2721f13d8eb8aac6af2758f9fd2ea697a2 |
A_Pair-v1.1.0-self-contained-linux-x64-unsigned |
8c856fa53a605ba3d8facca39b1de8d0aa6f8d76a4e32b904c49879834f337b8 |
A_Pair-v1.1.0-self-contained-osx-arm64-unsigned |
d8a3b937a0a80085b24bb6d24a167b938ab228ad3ca2a5b781189d68e99a4405 |
A_Pair-v1.1.0-self-contained-osx-x64-unsigned |
8f5cc8a9621aa5af3fd1832ffab4f138ed088e372f52cad107f13d0737eab2e7 |
A_Pair-v1.1.0-self-contained-win-x64-unsigned.exe |
1afc8d2f529c144ee50b1a7e15bdf6b625a9ee7b9eab0fecacd3e65e0f839eec |