Files
ClassHelper/prompts/permission-and-student-lifecycle.result.md
T

21 KiB
Raw Blame History

权限组治理与学生年度生命周期交付记录

日期:2026-10-23(Asia/Shanghai)。工作目录:D:\classhelper。版本保持 1.4.1。

任务源是 prompts/permission-and-student-lifecycle.prompt.md;用户消息中的路径缺少 prompts 后的目录分隔符,已按仓库实际文件定位。 工作目录未包含 .git,无法分阶段提交或提供 Git diff;没有初始化仓库、发布远端或改动 releases。已有无关工作保留。

实施与阶段验证

  • Phase 0:先阅读规则、指定文档和实现。基线 lint/typecheck 通过;v14 最初因缺测试密钥退出,隔离注入后 37/37 通过。新增专项先复现“资料 PATCH 接受毕业状态”的失败,再修复。
  • Phase 1:读写功能键、班级端守卫、独立升级键、页面门控和教师名单导入接通。取消键返回 403;教师全校授权可管理班级、查看归档和升级配置;班级详情不向无名单键者附带学生。
  • Phase 2:统一范围解析,阻止跨角色默认组、越键和越范围授权;角色默认组只由 ADMIN 编辑。审计同事务,成员权限预取计算;增加成员不增加权限查询次数。
  • Phase 3:资料不接受状态/班级,调班、转入出、撤回、复学、停用及移出共用事务入口。故障触发器证明历史失败时班级修改回滚;转出历史可读,毕业/归档不可复活,业务及历史阻止硬删除。
  • Phase 4:按轨道与有序学段升级;未知年级、缺届别、重复班号、已有档案、新班码冲突阻断。预览不写库,执行复核哈希,保存快照/SHA256,归档包含转出与停用,周次按计划保留或重置,同年幂等。
  • Phase 5:完成权限、学生、班级、归档、升级界面及指定文档同步。Web 构建和文档严格构建通过;关键页面完成隔离浏览器人工验收。

迁移与兼容

  1. 20261023000000_promotion_permission:为已存在的 ADMIN 默认组补 promotion:manage;无默认组时运行时初始模板自然包含。不会覆盖已有默认组的其他键。
  2. 20261023010000_student_lifecycle_audit:增加 PermissionAudit;历史新增 kind/batchId/academicYear/年级与学校快照;ArchivedYear 新增 inactiveCount;PromotionRun 新增操作人、明细、摘要和错误。
  3. 旧 single/batch → class-change,transfer-out 保持,restore-transfer → restore,然后删除 mode 列。DTO 中 mode 仅派生兼容,不再双写。
  4. SNAPSHOT_TABLES 已包含 PermissionAudit。旧快照没有此表时恢复为空,旧历史 mode 恢复时转换,缺列使用默认值。快照和执行记录不自动删除。
  5. 自定义权限组不会自动得到新升级键;已显式分配其他组的管理员或教务账号需要显式授予。旧客户端资料请求携带 classId/status、班级 PATCH 携带 grade 返回明确 400;旧 dryRun 升级请求提示改用预览和哈希确认接口。
  6. CLASS_DEVICE 权限集合仍为空。本班名单、课表、通知、叫人及代录作业保留,成绩写入拒绝,个人成绩查询开关保护保留。离线缓存、preload、CSP、设备心跳实现未改。
  7. 迁移、升级、种子与生命周期写入只在本次专用临时 SQLite 运行,未对业务库执行迁移、seed、reset 或升级。修正旧 e2e 固定 dev.db 连接探针;其本次创建的 0 字节空文件已核查后移除。

实际验证结果

命令 本次结果
pnpm lint 通过,无错误或警告
pnpm typecheck 通过,shared/server/web/desktop 全部完成
pnpm verify:lifecycle 32/32 通过,最近一次进程退出码 0
pnpm verify:v14 37/37 通过,进程退出码 0
pnpm verify:e2e 244/244 通过,进程退出码 0
pnpm verify:client-migrations 通过:旧默认组补键、旧 mode 映射、旧行默认值、空组保留及重启幂等
pnpm --filter @classhelper/web-admin build 通过
pnpm build:desktop 通过,产物凭据检查通过
pnpm docs:check 通过,docfx 0 warning / 0 error
pnpm verify:web:isolated 未通过:Electron 启动退出 2147483651(0x80000003),尚未进入 UI 用例
pnpm verify:desktop 未通过:同样在 Electron 启动阶段退出 2147483651,尚未进入客户端用例

受限终端最初读取 node_modules 遇到 EPERM;上表运行使用自动审批后的正常权限终端。pnpm 为仓库锁定的 11.8.0。 docfx 原先缺失,已安装到 .cache/docfx,NuGet/.NET 工具缓存也限制在仓库 .cache,没有改构建脚本的全局查找逻辑。 文档重跑时需将 .cache/docfx 加入 PATH。

原先 e2e 中“班级端不得通知/叫人”“名单仅管理员”“固定管理员字段”等旧断言与本次明确要求冲突,已改为验证新行为,并保留无键、跨班、成绩写入等拒绝断言。 导入成功夹具改用合法独立学生,结束时停用保留历史,恢复原在读名单,避免影响后续全班已读/完成统计。

隔离浏览器人工验收

在 127.0.0.1:54127 的专用临时库使用临时管理员、临时教师执行,没有连接真实班级。浏览器保持后台。

  • 管理员能打开独立“学年升级”页面,看到轨道、执行时间、开学日、周次策略与记录。
  • 点击预览后显示逐班/逐状态、哈希、周次影响;测试夹具的未知年级显示阻断,执行按钮禁用。未通过浏览器执行升级。
  • 权限页显示范围标签、实际成员数、更新时间及审计 Tab;编辑级长组使用年级下拉,显示服务端年级选项和影响预览,未提交权限变更。
  • 学生默认在读;编辑弹窗只有学号、姓名、性别、家长电话,缺少班级/状态字段。
  • 切到已转出可返回学生;历史抽屉包含转出记录、批次/学年、原新年级和学校字段。
  • 教师菜单可见班级、学生及学期周次;班级页面可读且隐藏创建、编辑、账号、删除等无管理键按钮。
  • 目视检查升级预览与名单布局。验收结束后检查 54127 无监听;临时浏览器页由会话清理。

已知限制与后续

  • Electron 自动 UI 与桌面冒烟仍未通过,需要在可正常启动该 Electron 运行时的 Windows 环境补跑;浏览器验收不能证明桌面离线、桥接或原生窗口运行正确。本次没有关闭安全保护来绕过启动问题。
  • 一次生命周期专项在全部断言通过后的连接释放阶段出现原生退出 0xC0000005;相同命令重跑 32/32 且正常退出。根因未确认,不把这次异常解释为断言失败,也不宣称已根治依赖层退出问题。
  • SQLite 新库与旧库升级、快照恢复已实测;未配置可用的隔离 MySQL 实例,未做 MySQL 真机读写回归。schema 没有加入 Prisma enum 或 @db.*。
  • 并发同年升级及幂等已由 v14 回归;没有另行穷举不同数据库进程、所有权限/岗位/接口组合。业务唯一键与事务仍是跨进程保护边界。
  • 旧库如果已有毕业标记与归档不一致等异常数据,预览会阻断并提示先核对,迁移不擅自猜测或复活学生。

修改文件

本记录的日志位于 .cache/lifecycle-*.log,变更清单位于 .cache/lifecycle-changed-files.json。