diff --git a/docs/tasks/T-302.md b/docs/tasks/T-302.md index c28926e..b459cf6 100644 --- a/docs/tasks/T-302.md +++ b/docs/tasks/T-302.md @@ -24,7 +24,7 @@ write_paths: - docs/04-architecture.md --- - + ## 问题 / 背景 T-203 已把管理员明确授权的任务原子转为 PENDING,T-301 已提供可撤销的真实设备身份,但采购工具还不能安全领取任务。T-302 建立服务端原子领取、幂等重放和租约续期边界,使同一授权只能产生一条可恢复 attempt;不实现客户端轮询、页面执行、事件、提交围栏或结果上报。 @@ -73,6 +73,10 @@ T-203 已把管理员明确授权的任务原子转为 PENDING,T-301 已提供 ### 2026-08-04T13:11:10Z · ila 2026-08-04 write_path 更正:上下文门禁发现 T-103 仍为 DOING 且已拥有共享文档 docs/current-state.md,T-302 同时声明会违反唯一写入者规则,因此不纳入、不修改。T-302 完成事实先记录在本任务;待 T-103 释放路径后由项目级文档同步任务统一更新。撤销线性化 P1 收紧不变。 + +### 2026-08-04T13:15:18Z · ila + +2026-08-04 预实现审计继续定值:claim 的 CLAIMED/EMPTY/需人工结果与 renew 成功都必须持久化幂等,同键重放不再次 CAS/延长;secret 启动时拒绝与 session 原始值或 key bytes 相同,并拒绝命中任何设备 token hash,所有 claim 逐行重建恒定时复核;证据首次写入要求同设备未关闭 claim,但已成功 upload_key 在 claim 关闭后仍先按原载荷稳定重放。HTTP JSON 上限 4096 bytes;claim 200、EMPTY 204,renew 200;400/413/415 固定错误,401/503 空,409 只用 idempotency_conflict、claim_requires_manual、claim_not_current。 ## 边界 @@ -85,6 +89,9 @@ T-203 已把管理员明确授权的任务原子转为 PENDING,T-301 已提供 - Claim token 是 attempt 归属凭据,不是采购授权,更不是提交许可。明文不得进入 SQLite、日志、错误、 Git、Vikunja 或测试 fixture;HMAC secret 必须与管理员 session secret、设备 token 分离。错误 secret 面对已有 claim 时必须拒绝启动,不能签发替代 token。 +- Secret 分离必须由启动检查执行:claim secret 的原始配置或解码 key 不得等于 session secret, + 其 SHA-256 不得命中任何设备 token hash;所有既有 claim(包括以后已关闭的)都必须用当前 secret + 逐条重建并恒定时复核,不能只检查开放 claim,也不能为通过启动而改写旧 hash。 - 租约和授权边界相等即过期,无宽限。过期租约不得续租、复活、自动关闭 attempt、释放授权或转给 另一设备;设备撤销、停止轮询和进程退出也不得触发自动接管。安全恢复归 T-207。 - 设备身份认证仍必须在解析 Content-Type 或读取 body 前完成;claim/renew 事务的第一条数据库业务 @@ -93,6 +100,8 @@ T-203 已把管理员明确授权的任务原子转为 PENDING,T-301 已提供 不得产生业务写入。 - 本任务只增加 claim/renew,并按 claim 所有权收紧已有证据上传;不得新增或提前实现 heartbeat、event、 fail、submission-fence、result、客户端 HTTP 适配、截图 kind 或页面自动化。 +- 证据首次写入必须属于当前认证设备的未关闭 claim;但相同设备与 `upload_key` 已成功落库的同载荷 + 在 claim 后续关闭后仍须先按 T-204 原结果稳定重放,不能把关闭 claim 变成幂等契约失效。 - 不接触拼多多页面判据、规格选择、数量、确认页或真机流程;不编写或引用点击“提交订单”的代码, 不编写支付、免密支付、先用后付或任何扣款控件代码。响应不得返回自由动作脚本、坐标、选择器或 `click_permitted`。