diff --git a/docs/superpowers/specs/2026-09-18-collection-phase-b-design.md b/docs/superpowers/specs/2026-09-18-collection-phase-b-design.md index 40acb7f..841f5e1 100644 --- a/docs/superpowers/specs/2026-09-18-collection-phase-b-design.md +++ b/docs/superpowers/specs/2026-09-18-collection-phase-b-design.md @@ -32,11 +32,11 @@ | 事件 | 触发 | 属性 | |---|---|---| | form_start | .wpcf7-form 内首次 isTrusted focusin/input(每表单实例一次) | form_id | -| form_submit | wpcf7submit(**每次尝试**) | form_id, submission_id(当次新生成 uuid) | +| form_submit | wpcf7submit(**每次尝试**) | form_id, submission_id | | form_error | wpcf7invalid / wpcf7spam | form_id, submission_id, error_code(invalid/spam/other——other 为 forward-compat 桶,若 CF7 源码核验发现其他失败事件则启用), field_count | | form_submit_result | wpcf7mailsent → result_code:"mail_sent";wpcf7mailfailed → "mail_failed" | form_id, submission_id, result_code | -- **submission_id 语义**:一次提交尝试 = 一个 ID(form_submit 时生成;result 引用最近一次的 ID)。form_start 不生成。 +- **submission_id 语义**:一次提交尝试 = 一个 ID——**原生 submit 捕获时生成并写入隐藏字段**(§1.5 时序设计),form_submit / result 事件引用该 ID。form_start 不生成。 - **form_id 规整**:从 CF7 unit_tag/action 解析表单编号 → `cf7-{ID}`(如 cf7-156),不暴露完整内部串。 - **不采任何输入值**(OT10);error_code 只取状态码 + 字段数,不采 invalid_fields 明细。 - form_submit_result 是**客户端声明**(事件名本身表达,不升级为可信确认)。 @@ -94,7 +94,7 @@ spec 附录写死(阶段C 直接照做,客迹侧零改动): -1. submission_id:uuid v4,form_submit 生成,`_ctk_sid` 隐藏字段随 POST 传输(§1.5)。 +1. submission_id:uuid v4,**原生 submit 捕获时生成、form_submit 事件引用**(§1.5 时序),`_ctk_sid` 隐藏字段随 POST 传输。 2. 认证端点:`POST /api/integrations/form-confirm`,站点级密钥(HMAC 签名 + 时间窗 ±5min + nonce 防重放 + submission_id 幂等);事件 form_submission_confirmed(白名单届时加入)。 3. WordPress mu-plugin 示例(约 20 行 PHP):hook `wpcf7_mail_sent` → 读 `$_POST['_ctk_sid']` + 表单摘要 → 签名转发。 4. 浏览器事件缺失时服务器确认仍成立(业务事实保留,浏览轨迹标缺);同 ID 重试不重复计数,内容变化报冲突。 @@ -113,7 +113,7 @@ spec 附录写死(阶段C 直接照做,客迹侧零改动): ## 7. 风险与边界 - CF7 事件形态按公开源码+invalid 实测锚定,mailsent 分支上线后以真询盘验证(诚实标注)。 -- `_ctk_sid` 注入对表单无行为影响(CF7 忽略未注册字段);submit 时更新值的可见性受 CF7 内部时序影响,不可靠场景该次对齐缺失(known-limitation)。 +- `_ctk_sid` 注入对表单无行为影响(CF7 忽略未注册字段);capture 原生 submit 先于 CF7 handler 构造 FormData,写入顺序确定性成立;残余风险仅为 capture 未及触发的极端时序空值(§5.4 兜底)。 - product_view 为 inferred URL 推导:跨语言同产品不关联、URL 结构变化需 bump rule_version。 - track 与自动监听双发:靠文档约定(不强制拦截),RawBatch 可诊断。 - 询盘漏斗末级为客户端声明(未验证措辞),阶段C 接确认通道后升级为"已验证询盘"。