[M-QUIZ-01] 冻结 choice、fill、judge 跨端契约并完善 fill 题型 #339
Closed
opened 2026-06-23 20:28:12 +08:00 by wangdl
·
1 comment
Labels
Clear labels
adr
Area: adr
architecture
Area: architecture
area:activity
活动/统计
area:admin
管理后台
area:admin-api
area:ai
AI/RAG
area:ai-runtime
AI Runtime / AI 分析体系相关
area:analytics
area:api
API 接口
area:auth
认证与授权
area:cos
对象存储
area:database
数据库/Migration
area:import
文件导入/解析
area:knowledge
知识库/知识点
area:learning-info
area:learning-session
area:quiz
测验/自测
area:reading-event
area:reading-progress
area:review
复习系统
area:security
安全相关
audit
Area: audit
audit:api-admin-info
audit:api-info
audit:planned
已完成宏观规划,尚未代码审查
audit:reviewed
backend
Area: backend
billing
Area: billing
blocked-by:api-info-aggregation
blocked-by:api-info-core
blocked-by:api-info-ops
blocked-by:api-info-schema
blocked-by:processor
blocked-by:schema
compatibility
Area: compatibility
gate
Area: gate
infrastructure
Area: infrastructure
priority:p0
最高优先级,阻塞发布
priority:p1
高优先级,里程碑必需
priority:p2
中优先级,后续版本
prisma
Area: prisma
release
Area: release
repo:api
API 仓库 Issue
status:blocked
被阻塞
status:done
已完成
status:partial
status:todo
type:aggregation
type:bug
缺陷修复
type:design
设计
type:docs
文档
type:feature
新功能
type:migration
type:refactor
重构
type:test
work:admin-api
work:aggregation
work:api
work:artifact
题目/卡片产物
work:audit
work:circuit-breaker
熔断
work:contract
work:design
架构/协议设计工作
work:docs
work:export
work:extend-existing
work:internal-api
Runtime 内部接口
work:job
Job 调度相关
work:new-module
work:new-table
work:ops
work:query
work:quota
额度/限流
work:schema
Prisma Schema 设计
work:security
work:service
Service 层实现
work:snapshot
Snapshot 构建
work:test
Milestone
No items
No Milestone
M-QUIZ-01 Quiz 答题闭环与跨端契约收口
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wangdl/api-server#339
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
类型 / 标签
backendioscontractquizp1依赖
M-QUIZ-01-01(Attempt 创建后才能验证契约)
目标
为当前真实存在的三种题型建立唯一、明确的跨端格式,并补齐 fill 的判分和结果展示。
真实题型
不得新增其他题型。
契约
为每种题型冻结:
choice
确认:
judge
确认统一使用一种规范值:
"true"/"false"(字符串)不得在不同层混用:
允许展示层本地化,但传输和存储必须统一。
fill
冻结规范化规则,至少评估:
不要实现复杂语义相似度或 AI 判分。
结果页必须显示:
类型安全
优先增加应用层类型:
本 Issue 原则上不修改 Prisma enum、不新增 Migration。
数据库历史非法 type 必须 fail-closed,不得自动按 choice 处理。
验收标准
"true"/"false")建议执行顺序
#4 — 依赖 Issue 01。可与 Issue 03 并行推进。
开发完成评论
完成内容
1. 创建共享契约模块
quiz-type.contract.tsQuestionTypeunion 类型("choice" | "fill" | "judge")isValidQuestionType()/assertValidQuestionType()— Validator allowlistisValidJudgeValue()— judge 值校验(仅接受字符串"true"/"false")normalizeFillAnswer()— fill 规范化规则:trim、空白归一、Unicode NFC、中文标点→英文、标点邻接空格剥离、ASCII 大小写 insensitivegradeFillAnswer()/gradeChoiceAnswer()/gradeJudgeAnswer()— 按题型判分gradeAnswer()— 通用分发入口(非法 type → fail-closed 抛错)2. 集成到 submit 判分
quiz.service.ts:submit()使用gradeAnswer()替代直接===比较BadRequestException3. 修复非法 type 静默降级
quiz-generation-projector.ts:107— 非法 type 记录 error 日志(fail-closed)runtime-internal.service.ts:486— 非法 type → 直接抛BadRequestExceptionquiz-generation-validator.ts— 使用共享契约VALID_QUESTION_TYPES+isValidJudgeValue4. 创建 Swift 契约枚举
QuizQuestionType.swift—enum QuizQuestionType: String, CodabledisplayAnswer(raw:options:)— choice 索引→选项文本displayName— 本地化展示名5. 测试
quiz-type.contract.spec.ts— 30 tests(类型校验 + fill 规范化 + 判分分发)quiz.service.spec.ts— 新增 fill 规范化判分 + 非法 type fail-closed 测试修改文件
src/modules/quiz/quiz-type.contract.ts(新建)src/modules/quiz/quiz-type.contract.spec.ts(新建)src/modules/quiz/quiz.service.ts— 集成gradeAnswersrc/modules/quiz/quiz.service.spec.ts— +3 testssrc/modules/ai-job/quiz-generation-validator.ts— 使用共享契约src/modules/ai-job/quiz-generation-projector.ts— fail-closedsrc/modules/ai-runtime/internal/runtime-internal.service.ts— fail-closedios-projects/.../QuizQuestionType.swift(新建)测试情况
xcodebuild ... build→ BUILD SUCCEEDED ✅契约摘要
"true"/"false"是否建议进入 Review