{
  "identity": "authored-method-example-not-executed",
  "title": "租户订单 CSV 导出：从方案到变更与验收",
  "description": "共同合同 CSV-1：仅导出当前用户所属租户的订单；固定数据快照、稳定排序、游标分页、流式输出、CSV转义及失败恢复。以下候选和控制由作者构造，未运行AI或真实服务。",
  "contractVersion": "CSV-1",
  "executionStatus": "not-run",
  "observedHumanMinutes": null,
  "observedSuccessRate": null,
  "input": {
    "actorTenant": "tenant-a",
    "pageSize": 2,
    "rows": [
      {
        "id": 1,
        "tenant": "tenant-a",
        "value": "普通订单"
      },
      {
        "id": 2,
        "tenant": "tenant-b",
        "value": "不得泄露"
      },
      {
        "id": 3,
        "tenant": "tenant-a",
        "value": "含,逗号"
      },
      {
        "id": 4,
        "tenant": "tenant-a",
        "value": "含\"引号\""
      },
      {
        "id": 5,
        "tenant": "tenant-a",
        "value": "同租户末页"
      }
    ]
  },
  "stages": [
    {
      "title": "W-C11 方案与契约",
      "output": "两路线共用CSV-1。沿用既有API/数据库并复用成熟CSV库，或在允许的托管数据库/存储能力上选择性组合；保留相同业务授权与验收。",
      "reject": "把数据库能导出当作业务授权正确；没有退出/恢复/配额说明。"
    },
    {
      "title": "W-C02 变更候选",
      "output": "候选：服务端绑定actorTenant，按唯一ID游标读取；流式CSV编码并处理转义；返回日志与可重试游标。候选为设计材料，未声明代码运行通过。",
      "reject": "客户端自行传租户即被信任；跨页漏重；整表一次加载；失败留下不可识别的半成品。"
    },
    {
      "title": "W-C12 正反控制与接收",
      "output": "预期正例：仅ID1/3/4/5，跨页不漏重，逗号和引号可重读；替代分页实现也可接受。反例：ID2泄露、末页丢行、错误转义、重复重试、超限内存。控制尚未执行。",
      "reject": "只检查文件存在/测试数，不核对实际内容、越权、资源与合法替代。"
    }
  ],
  "controls": [
    "正确租户与顺序",
    "不同合法实现",
    "跨租户泄露",
    "重复/缺失末页",
    "逗号/引号转义",
    "失败重试与资源上限"
  ],
  "intermediateArtifacts": {
    "identity": "authored-artifacts-and-expected-outcomes-not-executed",
    "contract": {
      "version": "CSV-1",
      "acceptance": [
        "每行租户与服务端actorTenant相等",
        "唯一ID升序，ID1/3/4/5各一次，ID2零次",
        "UTF-8 CSV由合规解析器往返读取，值完全相同",
        "固定快照上续读不漏重；失败工件不得作为完成发布"
      ],
      "resourceBoundary": "合成夹具pageSize=2，每次缓存≤2条业务记录；真实产品资源SLO尚未确定，不能从5条推断大规模性能。",
      "recovery": "固定数据快照。丢弃整个未完成临时工件时必须从起点重新生成，不复用旧游标。若选择保留已确认输出前缀，先验证前缀与lastConfirmedId一致，再从该游标追加；两种模式不得混用。完成原子标记后才可下载。"
    },
    "candidatePlan": [
      "服务端从会话绑定tenant-a，拒绝客户端覆盖",
      "查询固定snapshot，where tenant=actorTenant and id>cursor，order by id，limit 2",
      "逐页流式CSV编码，独立记录lastConfirmedId",
      "失败保持status=incomplete；成功原子发布status=complete"
    ],
    "expectedCsv": "id,value\r\n1,普通订单\r\n3,\"含,逗号\"\r\n4,\"含\"\"引号\"\"\"\r\n5,同租户末页\r\n",
    "expectedRows": [
      {
        "id": 1,
        "value": "普通订单"
      },
      {
        "id": 3,
        "value": "含,逗号"
      },
      {
        "id": 4,
        "value": "含\"引号\""
      },
      {
        "id": 5,
        "value": "同租户末页"
      }
    ],
    "acceptedAlternative": {
      "name": "具有固定快照且唯一ID排序的另一分页实现",
      "rows": [
        1,
        3,
        4,
        5
      ],
      "reason": "实现路径不同；业务、完整性、资源与恢复合同相同"
    },
    "negativeArtifacts": [
      {
        "id": "leak",
        "rows": [
          1,
          2,
          3,
          4,
          5
        ],
        "expected": "拒收：跨租户ID2"
      },
      {
        "id": "missing-last-page",
        "rows": [
          1,
          3,
          4
        ],
        "expected": "拒收：少ID5"
      },
      {
        "id": "duplicate",
        "rows": [
          1,
          3,
          3,
          4,
          5
        ],
        "expected": "拒收：ID3重复"
      },
      {
        "id": "escape",
        "csv": "id,value\r\n3,含,逗号\r\n",
        "expected": "拒收：解析后列数/值不一致"
      },
      {
        "id": "partial-published",
        "status": "complete",
        "rows": [
          1,
          3
        ],
        "expected": "拒收：中断工件被标为完成"
      },
      {
        "id": "unbounded-buffer",
        "peakBusinessRecords": 5,
        "expected": "拒收：超过本夹具2条缓存边界"
      }
    ],
    "controlExpectations": [
      {
        "control": "正确参考材料",
        "expected": "按合同接收",
        "observed": null
      },
      {
        "control": "合理替代",
        "expected": "同合同接收",
        "observed": null
      },
      {
        "control": "六种错误工件",
        "expected": "分别拒收并指出合同条目",
        "observed": null
      }
    ]
  }
}
