CSV 结构漂移审计
先判断两份文件是否来自同一数据契约,再比较结构。不要把业务波动误报为结构错误,也不要在未取得授权时改写源文件。
计费元数据与已验证状态
- Skill:
csv-schema-drift-auditor - 版本:
0.1.0 - 产品:
CSV_SCHEMA_DRIFT_AUDIT_V1 - 精确价格:人民币
1.00 元/次 - 生产服务端点:
https://skillpay.kongyizhihui.com/v1/csv-schema-drift-audits - 保存的端点证据:
DEPLOYED_VERIFIED,验证时间为2026-09-01;该证据包含本机/公网健康与 405 回归,以及一笔 1.00 元订单的 402、支付、回调和 entitlement 履约闭环。 - 证据边界:
VERIFIED_SINGLE_SAMPLE。这不证明长期可用性、SkillHub 账户资格、退款/对账能力或平台审核通过。 - CSV 失败策略:
FAIL_CLOSED_RETURN_TO_PAID_NO_AUTO_REFUND。履约失败不自动退款,订单退回PAID并记录错误;不得提示二次付款。 - SkillHub 付款入口:标准 X402
WeixinPay-Required用户授权链路。商户后端可使用微信 Native 下单,但原始code_url只用于换取payment_code,不得作为 SkillHub 默认二维码入口直接展示。 - 独立客户端边界:直接 Native 二维码只属于非 SkillHub 独立客户端能力;不得据此声称 SkillHub 运行时支持自定义二维码。
- 计费范围:一次支付只授予一组已经冻结的“基线 CSV + 当前 CSV”本地审计执行权。CSV 正文、字段名、字段值和文件路径不上传支付服务。
scripts/pay_skill_client.py check-config 只验证静态配置与保存证据,输出 RUNTIME_AND_USER_AUTHORIZATION_REQUIRED,不能证明当前 Agent 已加载微信支付能力。只有配置检查通过、当前运行时明确提供受支持的微信支付授权能力,并且用户即时授权精确金额和订单数量后,才能进入付费步骤。任一条件缺失时输出 PAY_READY=FAIL;可继续做不收费的文件可读性预检,但不得生成完整漂移报告或创建订单。
付费请求与幂等履约链
- 先做不收费预检:确认文件存在、为 UTF-8/UTF-8-SIG CSV、表头非空且唯一、用户明确了基线和当前文件。
- 生成只含行数区间、列数、键列数量和输出模式的最小任务描述;不得写入 CSV 正文、字段名、字段值、文件路径、个人信息、账号、密钥或 token。
- 取得创建订单的即时授权后,首次向生产端点 POST 冻结后的同一请求字节。预期 HTTP
402,同时返回WeixinPay-Required和X-Out-Trade-No;金额必须为1.00、币种必须为CNY。不得要求或展示响应中的原始 Nativecode_url。 - 将
WeixinPay-Required的值作为paymentCode交给 SkillHub 运行时受支持的微信支付授权能力,由用户本人确认并完成支付。不得代付,不得把paymentCode编码成二维码,不得在运行时能力缺失时创建新订单或伪造付款入口。二维码或支付挑战失效后,创建新订单必须重新取得数量、金额和停止点授权。 - 支付后携带原
WeixinPay-Required、原X-Out-Trade-No,向同一端点重试完全相同的请求字节。服务端按client_request_id + request_sha256绑定订单,并用订单号向微信查单;只有支付金额、币种和状态一致才履约。 - 相同请求重试只返回同一执行授权或缓存结果,不重复扣费、不重复履约。
PAYMENT_REQUIRED、FULFILLMENT_IN_PROGRESS、查单暂不可用和 5xx 均沿用原订单恢复;REQUEST_BINDING_MISMATCH或PAYMENT_CODE_MISMATCH立即停止。 - CSV 履约失败时执行 fail-closed:服务端不自动退款,订单退回
PAID并记录错误;修复后可在同一订单上恢复履约。退款、对账或人工售后必须独立授权和独立核验,不得写成自动成功。订单号只用于查单、恢复和售后定位,不等于支付成功。
完整操作细节见 references/pay-skill-flow.md。保存的生产证据不授权新的订单、支付、查单、履约、退款或对账;每次真实动作都需要新的即时授权。
输入确认
开始完整审计前确认:
baseline.csv是契约基线,current.csv是待验版本;不要仅按文件名猜测顺序。- 两份文件使用 UTF-8 或 UTF-8-SIG;其他编码先在副本上转换并保留来源哈希。
- 分隔符默认为半角逗号。制表符或分号文件必须显式传
--delimiter。 - 键列是业务上应唯一的一列或多列;不确定时不猜,先不启用键唯一性检查。
- 空字符串和仅含空白的单元格均按空值处理;
0、false和N/A不自动视为空值。
执行
读取 references/report-contract.md 后运行:
python3 "$SKILL_DIR/scripts/audit_csv_drift.py" \
--baseline baseline.csv \
--current current.csv \
--key order_id \
--json drift-receipt.json \
--markdown drift-report.md
复合键重复传入 --key:
python3 "$SKILL_DIR/scripts/audit_csv_drift.py" \
--baseline baseline.csv \
--current current.csv \
--key shop_id --key order_id \
--json drift-receipt.json \
--markdown drift-report.md
默认只在发现破坏性漂移或输入错误时返回非零退出码。需要让任何漂移阻断 CI 时加 --fail-on any;只想生成报告时用 --fail-on never。
判定边界
PASS:未发现结构、类型、空值或键唯一性漂移。REVIEW_REQUIRED:只有新增列、列顺序变化、空值比例增幅等需要人工确认的非破坏性变化。FAIL:缺列、不兼容类型变化、键列缺失、重复键率上升、变长行、空表、表头重复或输入不可读。- 类型推断只基于字面值,不能证明数据库类型、单位、枚举含义或业务语义。
- 空值率变化只说明数据形态变化,不能自动推出采集故障或业务异常。
- 工具不自动重命名列、不填补空值、不去重、不覆盖源文件。
最终交付
交付两份实际产物:JSON 回执用于 CI/台账,Markdown 报告用于人工复核。必须回读两份文件并核对输入 SHA-256、行列数、键列和最终状态一致。
最终说明至少包含:基线与当前文件、退出码、overall_status、破坏性项、需复核项、未检查边界。若任一输入或产物检查失败,只能标记 draft_needs_revision。
微信扫一扫