退款提交后断电
把未知响应与业务事实分开,用同一意图恢复。
合成教学数据 · 未运行真实模型静态推演与完整规格
I14 退款提交后断电
关联章节:M07 · 交互类型:fault-injection · 状态:提供纯逻辑参考函数,UI待实现
教学目标
把未知响应与业务事实分开,用同一意图恢复。
初始状态
{
"approved": false,
"expired": false,
"ledger_count": 0,
"committed": false,
"status": "PENDING",
"amount_cents": 10000
}
操作控件
批准
正常提交
提交前崩溃
提交后丢响应
同参重试
改变金额重试
推进至过期
重置
状态变化规则
批准只改变approval,不产生账本。
before_commit不留下业务写入;after_commit账本+1但响应状态UNKNOWN。
同参重试有已确认结果时只返回,不再加账本。
同意图不同金额拒绝;过期只禁止新执行。
黄金案例与反馈
lost-response
输入:
[
"approve",
"crash_after_commit",
"retry"
]
期望:
{
"ledger_count": 1,
"status": "CONFIRMED"
}
恢复读取已有操作结果。
precommit
输入:
[
"approve",
"crash_before_commit"
]
期望:
{
"ledger_count": 0,
"status": "RETRYABLE"
}
本地事务完整回滚。
unapproved
输入:
[
"submit"
]
期望:
{
"ledger_count": 0,
"status": "APPROVAL_REQUIRED"
}
正常模型输出也不能绕过批准。
完成条件
完成两种崩溃对照
保持重复重试账本=1
反馈层次
提交预测后显示结果;允许跳过预测但记录跳过,不阻止阅读
结果同时显示状态变化、原因与被拒绝动作;不是只给红绿灯
第一次错误给边界提示,第二次提供最小反例;参考推导始终可主动打开
重置恢复固定初始状态并保留历史尝试供用户手动清除
无障碍与静态替代
全部操作有原生button/input/select替代,不依赖拖拽
图与动画提供同步文字状态表;支持prefers-reduced-motion
状态改变用aria-live=polite摘要,不逐字朗读长日志
焦点不跳走;错误提示关联输入;颜色不是唯一编码
无JavaScript时直接展示初始输入、规则和黄金案例表,读者仍能完成纸面推演。状态动画仅作解释,不能成为获取答案的唯一途径。
持久化与重置
使用版本化键agent-course:1:I14,仅保存本地学习状态。支持单卡重置和全站清除;存储失败时以内存模式继续,不阻断阅读。
必须避免的误导
模拟的是单数据库事务;远程服务须依赖其幂等/查询契约。
执行边界
纯本地教学状态机;不执行任意代码,不连接真实资金/模型/宿主Shell。
逻辑参考
web/reference/engines.mjs中的refundStep;对应测试在web/reference/engines.test.mjs。UI可复用或等价移植,但不得改变黄金结果。