# -*- coding: utf-8 -*- """Content model for the revised online examination implementation plan.""" XZS_SQL = "https://github.com/mindskip/xzs-mysql/blob/master/sql/xzs-mysql.sql" XZS_SERVICE = "https://github.com/mindskip/xzs-mysql/blob/master/source/xzs/src/main/java/com/mindskip/xzs/service/impl/ExamPaperQuestionCustomerAnswerServiceImpl.java" EXAM_ANSWER = "https://github.com/Alanosy/exam-platform/blob/master/exam-back/ruoyi-modules/ruoyi-exam-answer/src/main/java/org/dromara/exam/answer/domain/ExamAnswer.java" PROCTOR_EVENT = "https://github.com/Alanosy/exam-platform/blob/master/exam-back/ruoyi-modules/ruoyi-exam-proctor/src/main/java/org/dromara/exam/proctor/domain/ProctorEvent.java" PROCTOR_SESSION = "https://github.com/Alanosy/exam-platform/blob/master/exam-back/ruoyi-modules/ruoyi-exam-proctor/src/main/java/org/dromara/exam/proctor/domain/ProctorSession.java" DEXIE = "https://github.com/dexie/Dexie.js" SHEDLOCK = "https://github.com/lukas-krecan/ShedLock" TESTCONTAINERS = "https://github.com/testcontainers/testcontainers-java" ORTOOLS = "https://github.com/google/or-tools" REVIEW_ROWS = [ ["R1 工作量", "锁定 P0/P1/P2 边界;问题一、二及 E1/E2 为不可砍核心,问题三和 E3/E6 设降级路径。", "已修正方案;里程碑须执行"], ["R2 权重同源", "先验权重+独立评估;若调权,只用训练集并冻结后评估;不调测试标签。", "已修正设计;待实验"], ["R3 正常样本", "正常轨迹来自知情自愿的模拟考试;脚本只构造作弊/异常,不作为正常类的唯一来源。", "待组织采集;按资源条件执行"], ["R4 客户端", "仅支持桌面 Chromium 浏览器;IndexedDB 不可用或容量不足时禁止开始离线考试,不承诺自动降级。", "已修正范围;待兼容测试"], ["R5 排期/指标", "统一 13 周;难度偏差以卡方为主,KL 仅在平滑处理并明确 epsilon 时辅助报告。", "已修正"], ["R6 快照自扰", "仅写脏会话,合并队列,批量落盘;与无快照、每会话直写分组比较。", "已修正设计;待压测"], ["R7 源码证据", "已核对学之思答卷表/保存服务、砚考答卷/监考实体;将结论限定为所读实体和保存路径。", "关键源码核验已完成"], ["R8 学术检索", "把 GitHub 未见实现与学术空白严格区分;按三条研究线完成定向检索后再写创新范围。", "待完成,不作为已实现结论"], ["R9 求解上界", "JDK 17 + or-tools CP-SAT 验证限半天;失败则保留随机/同行/本文算法对照。", "待时间盒验证"], ["R10 数据时效", "引用仓库与开源结论均标注检索/核验日期;论文定稿前复核链接与仓库版本。", "本文已标日期;定稿前复核"], ] SCOPE_ROWS = [ ["P0 必交付", "模块化单体;题库/考试/答题/交卷/客观判分;三种组卷算法;本地草稿、重放、幂等、冲突处理;E1/E2。", "从开考到成绩的可复现闭环;核心故障测试通过"], ["P1 应交付", "轻量行为事件、规则风险分与人工复核;outbox+对账;教师配置与基础审计;E4/E5。", "与 P0 不耦合;样本和评价协议完整"], ["P2 可裁剪", "主观题双评仲裁、监控大屏、500 并发实测、完整安全测试、or-tools 实测、界面美化。", "降级仅缩减范围,不伪造指标或数据"], ] DECISION_ROWS = [ ["模块化单体而非微服务", "三个核心问题可单库闭环;减少部署/分布式一致性成本,把时间留给可复现实验。", "保留api/internal边界;不宣称可零成本拆分"], ["当前答案+追加操作日志", "唯一当前答案防并发分叉;操作日志提供幂等、恢复、冲突证据,不混用版本链与主记录。", "answer_item与answer_operation分工"], ["服务端同步游标+独立op_id", "op_id识别操作,服务端游标只排序已受理事件;按题base_version防止过期写覆盖新值。", "不是客户端时间戳或大者胜出"], ["先验固定风险权重", "避免在同一批样本调参又评估;以信号有效性为目标而非产品级识别率。", "样本少时只作探索性结论"], ["不引入视觉AI/RocketMQ", "与轻量规则、可解释、低部署成本的目标一致;砍掉无关依赖而不砍核心问题。", "后续扩展不影响论文核心闭环"], ] MODULE_ROWS = [ ["user", "账号、角色、机构、JWT 会话", "权限校验;不暴露密码/令牌"], ["question", "题目、知识点、难度与题目标签", "只读供给组卷;保留题干/答案来源与版本"], ["paper", "组卷规则、求解、试题快照与发布", "paper_rule JSON 经 Schema 校验;发布后不可回改已开考卷"], ["exam", "场次、考生会话、答案同步、交卷", "唯一拥有当前答案写入口;游标分配与状态迁移"], ["grading", "客观判分、主观评分(P2)、重试", "读取交卷快照;不直接修改答案"], ["score", "成绩、发布、复核、对账", "通过事件/API 获取判分结果;版本化成绩"], ["monitor", "行为事件、风险评分、复核与审计", "可疑提示,不作自动作弊定性或自动零分"], ["common", "错误码、审计接口、幂等组件、事件封装", "不含业务规则;不形成跨模块公共数据访问"], ] TABLE_ROWS = [ ["user", "id、account、role、org_id、password_hash", "密码仅保存哈希;按账号唯一"], ["question", "id、type、stem、difficulty、answer、version", "教师维护;组卷读取发布版本"], ["knowledge_point", "id、name、parent_id", "树形知识点"], ["question_knowledge", "question_id、knowledge_point_id", "联合唯一;多对多关联"], ["paper", "id、name、total_score、status、version", "发布后形成试卷快照"], ["paper_rule", "paper_id、constraint_json、strength、schema_version", "配置版本与校验结果可追溯"], ["paper_question", "paper_id、question_id、score、sequence", "联合唯一;快照分值/题序"], ["exam", "id、paper_id、start_at、end_at、policy_json", "考试策略随场次固化"], ["exam_session", "id、exam_id、user_id、status、next_seq", "(exam_id,user_id) 唯一;next_seq 分配服务端游标;状态迁移用会话行锁,不另设version"], ["answer_item", "session_id、question_id、answer_json、version、last_op_id", "(session_id,question_id) 唯一,仅存当前答案"], ["answer_operation", "session_id、server_seq、op_id、actor_id、client_seq、question_id、base_version、result_version、status、payload_hash", "(session_id,server_seq)、op_id、(session_id,actor_id,client_seq) 唯一;server_seq可空"], ["answer_draft_log", "session_id、op_id、conflict_type、client_version、server_version、payload_hash", "保留脱敏冲突证据;原文留在客户端待处置"], ["submission", "id、session_id、submit_token、request_hash、result_json、created_at", "session_id与(session_id,submit_token)均唯一;同token不同请求体拒绝"], ["score", "id、session_id、grading_version、total_score、status", "(session_id,grading_version)唯一;复核生成新版本"], ["cheat_event", "id、session_id、type、evidence_ref、observed_at、received_at", "接收时间独立;原始事件追加不可改"], ["outbox", "id、event_type、aggregate_id、payload、status、retry_count、next_retry_at", "业务事务内写入;支持重试/死信状态"], ["audit_log", "id、actor_id、action、object_id、detail_json、created_at", "处置与敏感操作留痕"], ] API_ROWS = [ ["POST /api/exam-sessions", "创建/恢复本人场次", "校验报名与时间;返回session_id、当前游标、规则快照"], ["POST /api/exam-sessions/{id}/operations:batch", "幂等批量重放答案操作", "返回逐op状态、最新版本与当前同步游标"], ["GET /api/exam-sessions/{id}/sync?afterSeq=n", "拉取缺失的服务端操作与状态", "只返回本人数据;含权威next_seq和考试状态"], ["POST /api/exam-sessions/{id}/submit", "幂等交卷并冻结答案", "(session_id,submit_token)+request_hash;返回稳定submission_id/状态"], ["GET /api/exam-sessions/{id}/submission", "恢复交卷结果", "断线后按会话查询,不新生成token"], ["POST /api/exam-sessions/{id}/proctor-events", "接收行为事件", "限制频率/大小;校验类型、时间、来源;事件与风险分分离"], ["POST /api/papers:solve", "按约束求解组卷", "记录rule/schema/version、seed、参数、状态与耗时"], ] STATE_ROWS = [ ["服务端:NOT_STARTED→ANSWERING", "身份、报名、时间、存储检查通过", "创建/恢复会话;同步游标从0开始"], ["服务端:ANSWERING→SUBMITTING", "考生交卷或到时收卷", "将受理截止时间固定到事务开始时刻;拒绝新到达答案"], ["服务端:SUBMITTING→SUBMITTED", "截止时间前已受理事务提交;答案与试卷快照冻结成功", "同事务写submission与outbox;返回稳定凭证"], ["服务端:SUBMITTING→SUBMIT_FAILED_RETRYABLE", "暂时性资源/网络失败", "回滚本次交卷写入;原token重试或查询,不丢本地草稿"], ["服务端:SUBMITTED→GRADING→SCORED", "判分与成绩生成", "失败可重试;同一事件不重复产生成绩版本"], ["服务端:SCORED→REVIEWING→SCORED", "有权限的人工复核", "记录原因、成绩版本与审计链"], ["客户端:ONLINE↔OFFLINE_DIRTY→REPLAYING", "网络变化;本地有待同步操作", "仅是同步状态,不直接改服务端考试状态"], ["客户端:REPLAYING→ONLINE/CONFLICT_REQUIRED", "全部受理或存在同题版本冲突", "冲突原文保留本地,须考生/教师按权限处置"], ["客户端:SUBMIT_UNKNOWN→SUBMITTED/ANSWERING", "交卷响应丢失后查询权威结果", "同token重试或查询,不盲目再次交卷"], ] EXPERIMENT_ROWS = [ ["E1 组卷", "固定题库/约束/种子;3算法×3强度×各100次;预检区分无可行解与求解失败。", "成功率、耗时、总分误差、知识点覆盖偏差、难度卡方;KL仅平滑辅助。", "随机重试、同行遗传算法;可选CP-SAT上界", "P0;先小样本打通,参数一次冻结"], ["E2 一致性", "断网30秒/5分钟、重启、重放同批、乱序/重复seq、交卷竞争;记录全量操作日志。", "操作可追踪率、答案语义正确率、会话语义正确率、非预期重复数、恢复时长。", "无IndexedDB草稿;无幂等保护(仅隔离测试库)", "P0;自动化断言,不以录屏代替"], ["E3 性能", "记录CPU/内存/JDK/数据库/浏览器;按100→250→500逐步加压,读写混合。", "P50/P95/P99、错误率、TPS、数据库连接/锁等待;快照写次数。", "无缓存、逐会话同步快照、批量脏快照", "P2;资源不足则报告实测点,不外推为已达标"], ["E4 风险识别", "真实正常轨迹+脚本异常;先验等权/固定权重;按考生划分训练与评估,避免同人泄漏。", "召回率、误报率、PR-AUC/单信号AUC、置信区间;阈值与混淆矩阵。", "仅切屏规则、等权基线", "P1;资源不足降级为信号有效性探索,不称实用产品"], ["E5 成绩一致性", "测试环境注入判分异常、重复事件、延迟/丢失投递;事务与对账日志关联。", "不一致检出率、修复率、端到端时延、重复处理结果一致性。", "关闭对账;同事件重放", "P1;不得破坏真实成绩数据"], ["E6 安全", "水平/垂直越权、伪造op/session/token、参数绑定、登出与令牌过期、存储失败。", "用例通过率;敏感数据暴露清单;异常后可恢复性。", "按OWASP基础用例", "P2;最低保留越权与伪造请求用例"], ] SCHEDULE_ROWS = [ ["1", "证据与范围冻结", "文献检索计划、源码笔记、P0接口/数据字典", "评审风险责任到人;不扩需求"], ["2", "工程基线", "JDK17/Boot3/MyBatis-Plus适配;Compose与CI;模块边界检查", "环境一键启动"], ["3", "薄链路", "登录→建卷→考试→答题→交卷→客观成绩", "必须端到端可跑;未通则停止扩展"], ["4–5", "问题一", "约束Schema、预检、三算法、规则配置与实验记录", "E1数据与图;固定种子可复跑"], ["6–7", "问题二", "Dexie操作日志、批量同步、服务端唯一约束、幂等交卷", "E2核心场景通过;先正确再优化"], ["8", "业务闭环", "outbox、客观判分、成绩与对账", "E5最小实验;无中间件扩展"], ["9", "风险识别(可降级)", "事件采集、固定规则、复核;招募与知情流程", "仅采集获准数据;先冻结评价协议"], ["10", "核心补测", "E1/E2/E5复测;故障与接口回归", "不允许只保留成功截图"], ["11", "P1/P2实验", "E4;按余量做E3/E6", "按实测报告,不预设500并发达标"], ["12", "论文与清理", "初稿、实验归档、许可证/隐私/局限说明", "正文结论能追溯数据与脚本"], ["13", "验收与答辩", "回归、录屏、一键演示、论文定稿", "离线演示与故障脚本均可运行"], ] RISK_ROWS = [ ["答案冲突协议错误", "唯一约束+事务+状态机先行;Testcontainers覆盖重放/乱序/交卷竞争", "任何核心用例失败即停止性能优化"], ["约束无可行解", "供给量与总分/题型/知识点预检;记录不可行而非记为算法超时", "无解用例单列"], ["算法调参失控", "一组固定参数+一组消融;隐藏最终评估用例", "时间耗尽则减少算法参数,不删基线"], ["正常样本招募不足", "提前招募;脚本与真实轨迹分标签", "不足则缩小E4结论,不冒充真实误报率"], ["断网演示失败", "DevTools Offline、服务重启脚本与已保存数据快照", "先保证自动化结果,再准备录屏"], ["性能资源不足", "逐级加压、限制测试数据量、分离快照与业务写", "报告环境与瓶颈;不外推未测并发"], ["隐私或许可证风险", "最小采集、知情同意、哈希/脱敏;AGPL/无许可代码只读不复制", "复核清单不通过则不发布"], ] ACCEPT_ROWS = [ ["架构", "单应用可启动;模块依赖可检查;无跨模块Mapper;核心业务不依赖Redis可用", "启动日志、依赖检查、模块测试"], ["组卷", "三算法同接口;规则与种子可复现;不可行输入有明确输出;E1可复跑", "脚本、配置、原始CSV、图表"], ["答案一致性", "一道题一个当前答案;重复op不重复生效;过期写不覆盖新值;交卷后拒绝写入", "自动化断言+数据库查询+故障日志"], ["成绩", "交卷/判分/成绩状态可追踪;重复事件不重复算分;对账能发现并修复测试异常", "E5记录与审计链"], ["风险识别", "风险分可解释、事件可复核;评估与调参隔离;无自动作弊定性", "规则版本、样本划分、混淆矩阵"], ["工程", "桌面浏览器流程可用;异常有错误码;核心路径自动化;部署和备份说明完整", "测试报告、Compose、README"], ["论文", "目标/结果分开;报告负结果;限制与数据来源明确;链接、日期、许可证可追溯", "文稿、数据清单、来源清单"], ]