这份批准还能用吗?
批准绑定具体意图与有效期,而不是一句“用户同意”。
合成教学数据 · 未运行真实模型静态推演与完整规格
I10 这份批准还能用吗?
关联章节:M05 · 交互类型:approval-binding · 状态:提供纯逻辑参考函数,UI待实现
教学目标
批准绑定具体意图与有效期,而不是一句“用户同意”。
初始状态
{
"approved": {
"order_id": "A100",
"amount_cents": 10000,
"order_version": 1,
"policy_version": "policy-v2",
"operation_id": "op-1",
"expires_at": 130
},
"now": 110,
"same_principal": true,
"already_committed": false
}
操作控件
改金额
改订单版本
推进时钟
更换当前用户
切换已执行记录
检查是否可新执行/重放
状态变化规则
先检查身份;再检查参数是否绑定同一意图。
尚未提交时now>=expires_at拒绝。
已有同参确认结果时只返回旧结果,不再执行,因此允许过期后的重放读取。
黄金案例与反馈
expired
输入:
{
"now": 130,
"already_committed": false,
"same_digest": true,
"same_principal": true
}
期望:
{
"status": "APPROVAL_EXPIRED"
}
有效期边界为严格小于。
replay
输入:
{
"now": 500,
"already_committed": true,
"same_digest": true,
"same_principal": true
}
期望:
{
"status": "RETURN_STORED"
}
这不是重新授权一个过期副作用。
changed
输入:
{
"same_digest": false,
"already_committed": false,
"same_principal": true,
"now": 110
}
期望:
{
"status": "DIGEST_MISMATCH"
}
新金额需要新的提案和批准。
完成条件
正确区分新执行与旧结果重放
演示金额/身份/时间任一失配拒绝
反馈层次
提交预测后显示结果;允许跳过预测但记录跳过,不阻止阅读
结果同时显示状态变化、原因与被拒绝动作;不是只给红绿灯
第一次错误给边界提示,第二次提供最小反例;参考推导始终可主动打开
重置恢复固定初始状态并保留历史尝试供用户手动清除
无障碍与静态替代
全部操作有原生button/input/select替代,不依赖拖拽
图与动画提供同步文字状态表;支持prefers-reduced-motion
状态改变用aria-live=polite摘要,不逐字朗读长日志
焦点不跳走;错误提示关联输入;颜色不是唯一编码
无JavaScript时直接展示初始输入、规则和黄金案例表,读者仍能完成纸面推演。状态动画仅作解释,不能成为获取答案的唯一途径。
持久化与重置
使用版本化键agent-course:1:I10,仅保存本地学习状态。支持单卡重置和全站清除;存储失败时以内存模式继续,不阻断阅读。
必须避免的误导
页面哈希只能说明绑定,不代替真实认证;本卡是逻辑模拟。
执行边界
纯本地教学状态机;不执行任意代码,不连接真实资金/模型/宿主Shell。
逻辑参考
web/reference/engines.mjs中的approvalDecision;对应测试在web/reference/engines.test.mjs。UI可复用或等价移植,但不得改变黄金结果。