{
  "metadata": {
    "schema_version": "1.0",
    "updated_at": "2026-10-23",
    "publication_status": "published_verified",
    "source_path": "delivery/index.html",
    "source_url": "https://www.frontlab.cn/delivery/index.html",
    "source_url_status": "canonical_url",
    "source_url_note": "本版于 2026-10-23 发布并核验可访问；不表示已被搜索收录或被 Agent 推荐。",
    "path_base": "site_root",
    "indexing_status": "indexable_not_proof_of_indexing"
  },
  "cta": {
    "label": "讨论一个业务问题",
    "contact_path": "contact/index.html",
    "secondary_label": "看看我们如何交付",
    "secondary_path": "delivery/index.html"
  },
  "modes": [
    "诊断与方案",
    "项目交付",
    "持续协作"
  ],
  "workflow": [
    {
      "id": "understand",
      "title": "确定要解决的工作",
      "description": "说明业务问题、当前做法、期望变化和可用资料，双方判断服务是否匹配。"
    },
    {
      "id": "scope",
      "title": "约定范围与验收",
      "description": "确认首个成果、输入、责任人、验收方式、报价和协作安排。"
    },
    {
      "id": "deliver",
      "title": "制作、实施与试用",
      "description": "按确认方向开展工作，用真实样本核对结果；需要时保留人工兜底。"
    },
    {
      "id": "handover",
      "title": "验收与交接",
      "description": "交接约定文件、内容或系统，记录使用说明、权限及后续维护安排。"
    }
  ],
  "pricing": {
    "basis": "按项目范围报价；诊断设计、制作开发、数据与接口、上线维护及第三方费用分别确认。",
    "schedule": "按项目确认。",
    "default_commitments": "不默认承诺免费诊断、固定价格、固定工期、反馈时限或收益比例。"
  },
  "contact_contract": {
    "version": "2.0",
    "contact_path": "contact/index.html",
    "recipient": "hao@frontlab.studio",
    "required_fields": [
      {
        "key": "name",
        "label": "称呼",
        "max_length": 80
      },
      {
        "key": "contact",
        "label": "联系方式",
        "max_length": 180
      },
      {
        "key": "goal",
        "label": "一句话业务问题",
        "max_length": 2000
      }
    ],
    "optional_fields": [
      {
        "key": "service",
        "label": "业务类别",
        "allowed_values": [
          "discovery",
          "ai-consulting",
          "ai-growth",
          "ai-content",
          "ai-operations",
          "ai-development"
        ],
        "prefill": "人类表单未选择业务时使用discovery（希望先讨论需求），可由服务页预选五项业务之一；用户可修改，不能留空。Agent HTTP请求必须显式提供service，服务端不补默认值。",
        "default": "discovery",
        "default_label": "希望先讨论需求",
        "allow_empty": false,
        "required_user_input": false,
        "default_scope": "human_form_only",
        "required_in_http_request": true
      },
      {
        "key": "company",
        "label": "公司或团队",
        "max_length": 150
      },
      {
        "key": "timeline",
        "label": "期望时间",
        "max_length": 150
      },
      {
        "key": "focus",
        "label": "具体需求",
        "allowed_values": [
          "",
          "custom-agents",
          "fde",
          "geo"
        ],
        "default": "",
        "allow_empty": true,
        "required_user_input": false,
        "prefill": "可由重点入口预选；选择有效具体需求时，业务类别自动匹配所属业务。"
      }
    ],
    "transport": "same_origin_http_post",
    "backend_submission_available": true,
    "automatic_send": false,
    "delivery_guaranteed": false,
    "actions": [
      {
        "action": "submit_inquiry",
        "result": "用户同意用途并提交后，同源POST /api/inquiries；仅收到ok:true、status:received和受理编号才显示已保存。"
      },
      {
        "action": "generate_draft",
        "result": "在当前页面生成邮件草稿；没有提交到公司。"
      },
      {
        "action": "open_mailto",
        "result": "用户点击后尝试打开自己的邮件客户端，由用户核对并确认发送；打开客户端不代表已发送或送达。"
      },
      {
        "action": "copy",
        "result": "用户复制草稿，再自行通过可用渠道发送。"
      },
      {
        "action": "download",
        "result": "用户下载草稿作备用，再自行发送。"
      }
    ],
    "completion_rule": "HTTP 200/201且返回ok:true、status:received及受理编号，才确认后台已保存；不代表客服已读或邮件已达。邮件草稿是备选，生成、复制、下载与打开客户端不等于已发送。",
    "follow_up": "收到后再沟通服务匹配、资料与合作范围；本站不承诺固定回复时限。",
    "optional_fields_note": "人类表单不要求用户首次主动选择service，未选择时前端使用discovery且不能留空；这不是HTTP服务端默认值。Agent HTTP请求须显式提供service。focus、company和timeline可留空；focus仅允许空值或三项重点入口id。预算和其他背景可在业务问题或邮件中手动补充，不是独立表单字段。",
    "focus_service_map": {
      "custom-agents": "ai-development",
      "fde": "ai-consulting",
      "geo": "ai-growth"
    },
    "focus_labels": {
      "custom-agents": "企业智能体定制",
      "fde": "FDE 咨询与落地",
      "geo": "GEO 与 AI 搜索营销"
    },
    "prefill_rules": {
      "valid_focus": "查询参数 focus 为 custom-agents、fde 或 geo 时，优先采用该 focus 并自动匹配所属 service，覆盖冲突的 service 参数。",
      "invalid_focus": "focus 为空或不在允许值中时忽略；service 按原有有效值规则处理，无有效值时使用 discovery。",
      "focus_change": "用户选择有效 focus 时自动匹配对应 service；清空 focus 时不强制改变 service。",
      "service_change": "用户更改 service 后，如与当前 focus 所属业务不一致，清空 focus。"
    },
    "draft_fields": [
      {
        "key": "name",
        "label": "称呼"
      },
      {
        "key": "contact",
        "label": "联系方式"
      },
      {
        "key": "goal",
        "label": "一句话业务问题"
      },
      {
        "key": "service",
        "label": "业务类别"
      },
      {
        "key": "company",
        "label": "公司或团队"
      },
      {
        "key": "timeline",
        "label": "期望时间"
      },
      {
        "key": "focus",
        "label": "具体需求"
      }
    ],
    "draft_fields_note": "生成、复制、下载与邮件入口使用同一份草稿。草稿含业务类别和具体需求的可读名称；focus 为空时具体需求显示“未指定”。",
    "submission_status": "live_verified",
    "consent": {
      "key": "consent",
      "type": "boolean",
      "required_value": true,
      "label": "同意禺能使用以上信息与我沟通本次需求",
      "purpose": "仅用于本次需求沟通，不用于营销订阅。"
    },
    "honeypot": {
      "key": "website",
      "required_value": ""
    },
    "http_api": {
      "method": "POST",
      "path": "/api/inquiries",
      "url": "https://www.frontlab.cn/api/inquiries",
      "headers": {
        "Content-Type": "application/json",
        "Idempotency-Key": "UUID；同一内容重试复用，编辑后换新",
        "Origin": "https://www.frontlab.cn"
      },
      "body_fields": [
        "name",
        "contact",
        "goal",
        "service",
        "focus",
        "company",
        "timeline",
        "website",
        "consent"
      ],
      "timeout_seconds": 15,
      "success_http_statuses": [
        200,
        201
      ],
      "success_body": {
        "ok": true,
        "reference": "YN-...",
        "status": "received",
        "message": "需求已收到并保存。请保留受理编号。"
      },
      "success_meaning": "后台已保存需求并返回受理编号；不代表人工已读、通知邮件已达或已达成合作。",
      "error_http_statuses": [
        400,
        403,
        404,
        405,
        409,
        413,
        415,
        429,
        500,
        503
      ],
      "retry_rule": "仅HTTP 200/201且ok:true、status:received及非空reference可确认后台已保存。超时、网络错误、500/502/503/504或无法解析/不完整回执不确认提交；保留同一内容和原Idempotency-Key，遵循Retry-After（如有）后稍后重试。429先等待；400/403/404/405/409/413/415先按错误分类修正，不原样循环重试。编辑内容后用新UUID；单纯重试同一内容不得换key；成功后同内容同key返回原受理编号。",
      "attachments_supported": false,
      "customer_autoreply": false,
      "notification": "后台保存后异步通知业务邮箱；通知状态不改变received含义。",
      "access": "公开接口只接收需求，不提供线索读取；线索仅在受保护后台查看。",
      "request_schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "contact",
          "goal",
          "service",
          "consent"
        ],
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "contact": {
            "type": "string",
            "minLength": 1,
            "maxLength": 180
          },
          "goal": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "service": {
            "type": "string",
            "enum": [
              "discovery",
              "ai-consulting",
              "ai-growth",
              "ai-content",
              "ai-operations",
              "ai-development"
            ],
            "description": "必须显式提供；尚未选择业务时发送discovery，服务端不补默认值。"
          },
          "focus": {
            "type": "string",
            "enum": [
              "",
              "custom-agents",
              "fde",
              "geo"
            ],
            "default": ""
          },
          "company": {
            "type": "string",
            "maxLength": 150,
            "default": ""
          },
          "timeline": {
            "type": "string",
            "maxLength": 150,
            "default": ""
          },
          "website": {
            "type": "string",
            "const": "",
            "default": ""
          },
          "consent": {
            "type": "boolean",
            "const": true
          }
        }
      },
      "normalization": "name、contact、goal、company、timeline先去除首尾空白，再按Unicode字符数核对长度；必填字符串去空白后不得为空。禁止非法控制字符和孤立代理字符。JSON不得有重复键或NaN/Infinity；service缺省或不在枚举内返回400 INVALID_SERVICE，focus无效也返回该码。有效focus覆盖所属service，但仍须先提供有效service。",
      "headers_note": "规范同源入口使用Origin: https://www.frontlab.cn；后端也接受https://frontlab.cn。本站浏览器自动携带同源Origin；原生HTTP Agent按此声明入口契约发送。Origin不是认证凭据，也不代表用户已授权或同意。未支持外站浏览器CORS预检；不要从其他网站的浏览器脚本直接调用。",
      "allowed_origins": [
        "https://www.frontlab.cn",
        "https://frontlab.cn"
      ],
      "origin_is_authentication": false,
      "cross_origin_browser_cors_supported": false,
      "max_body_bytes": 16384,
      "encoding": "UTF-8 JSON；Content-Type为application/json，可带charset=utf-8；不支持Transfer-Encoding，HTTP客户端须提供Content-Length。",
      "proxy_error_http_statuses": [
        400,
        413,
        429,
        502,
        504
      ],
      "error_body": {
        "ok": false,
        "code": "INVALID_SERVICE",
        "message": "服务类型不正确。"
      },
      "error_response_schema": {
        "type": "object",
        "required": [
          "ok",
          "code",
          "message"
        ],
        "properties": {
          "ok": {
            "const": false
          },
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "error_responses": [
        {
          "status": 400,
          "codes": [
            "INVALID_FIELDS",
            "INVALID_FIELD",
            "INVALID_SERVICE",
            "CONSENT_REQUIRED",
            "INVALID_REQUEST",
            "INVALID_PROXY_IP",
            "INVALID_IDEMPOTENCY_KEY",
            "INVALID_CONTENT_LENGTH",
            "INVALID_JSON",
            "INVALID_HTTP"
          ],
          "meaning": "字段、授权同意、请求编号、JSON或HTTP格式不合要求。",
          "retry": "先修正请求；内容改变后用新UUID，不原样循环重试。"
        },
        {
          "status": 403,
          "codes": [
            "ORIGIN_NOT_ALLOWED"
          ],
          "meaning": "Origin不在允许入口中。",
          "retry": "先核对已声明入口；不得伪造用户授权，不能靠换key解决。"
        },
        {
          "status": 404,
          "codes": [
            "NOT_FOUND"
          ],
          "meaning": "路径不存在，或GET公开读取被禁止。",
          "retry": "核对POST及精确路径；不将GET 404判为POST故障。"
        },
        {
          "status": 405,
          "codes": [
            "METHOD_NOT_ALLOWED"
          ],
          "meaning": "方法不支持；响应Allow: POST。",
          "retry": "改用POST；外站浏览器CORS未支持。"
        },
        {
          "status": 409,
          "codes": [
            "IDEMPOTENCY_CONFLICT"
          ],
          "meaning": "同一UUID已用于不同内容。",
          "retry": "核对原内容；用户编辑后的新内容使用新UUID。"
        },
        {
          "status": 413,
          "codes": [
            "BODY_TOO_LARGE"
          ],
          "meaning": "请求体超过16KiB。",
          "retry": "缩短内容后用新UUID；代理也可能返回非JSON 413。"
        },
        {
          "status": 415,
          "codes": [
            "UNSUPPORTED_MEDIA_TYPE"
          ],
          "meaning": "不是支持的UTF-8 JSON媒体类型。",
          "retry": "修正Content-Type和编码后再提交。"
        },
        {
          "status": 429,
          "codes": [
            "RATE_LIMITED"
          ],
          "meaning": "业务接收频率或数量限制。",
          "retry": "若有Retry-After按秒等待；缺失时稍后重试，避免立即循环；同一内容复用原key。"
        },
        {
          "status": 500,
          "codes": [
            "INTERNAL_ERROR"
          ],
          "meaning": "内部处理异常，未确认本次受理结果。",
          "retry": "不确认提交；保留内容和原key，稍后按同一内容重试。"
        },
        {
          "status": 503,
          "codes": [
            "STORAGE_UNAVAILABLE",
            "BUSY"
          ],
          "meaning": "存储暂不可用或处理繁忙，未确认受理。",
          "retry": "遵循Retry-After后同内容原key重试；存储不可用通常30秒，处理繁忙10秒。"
        }
      ],
      "retry_after": "业务层429可能返回Retry-After（秒）；存储503返回30，处理繁忙503返回10。代理层响应不保证提供该头；不要假设所有错误都带Retry-After。",
      "proxy_error_note": "Nginx可能在请求到达业务后端前返回400/413/429，或在代理连接、上游响应失败/超时时返回502/504；可能是HTML而非JSON，且不保证有code/message或Retry-After。其他非成功HTTP、非JSON或缺失成功字段的响应均不能确认已保存。",
      "completion_evidence_note": "既有上线及201保存验收证明该次测试需求保存成功；不为每条后续请求保证成功，不代表任何人工已读或通知邮件已达。"
    },
    "preview_rule": "file:本地预览不发POST；需在线上页面提交，可保留邮件草稿备选。",
    "field_scope_note": "required_fields与optional_fields描述人类表单是否需要主动填写；HTTP请求是否必需以http_api.request_schema.required为准。service不要求人类用户主动选择，但Agent必须显式提交其值。"
  },
  "agent_actions": {
    "supported": [
      "读取公开资料，判断五项业务及三项重点入口的匹配关系",
      "根据用户信息整理需求，并核对必填字段及用途同意",
      "用户明确授权提交且同意用途后，通过公开HTTP接口POST需求；使用UUID幂等键并按契约重试",
      "仅在返回received与受理编号时报告后台已保存"
    ],
    "unsupported": [
      "未经用户授权提交或替用户同意用途",
      "读取已提交线索、上传附件或自动向客户回信",
      "把received描述为人工已读、邮件已达或合作成立",
      "把草稿生成、复制、下载或打开客户端描述为已发送"
    ],
    "mcp_submission_available": false,
    "http_submission_available": true,
    "user_authorization_required_for_submission": true,
    "consent_required": true,
    "publication_status": "published_verified"
  },
  "evidence_policy": {
    "delivery_example_status": "illustrative_not_customer_case",
    "delivery_example_label": "交付示意，非已完成客户案例",
    "separate_states": [
      "方案",
      "试点",
      "已交付",
      "已采用",
      "已上线",
      "持续运营"
    ],
    "claims": "只使用已获准公开且可核对的证据。没有真实对照数据，不宣称收益或提效比例。"
  }
}
