{
  "schemaVersion": "0.1",
  "id": "cloudflare-pages-gray-deployment-handoff-20260711",
  "generatedAt": "2026-07-14T03:30:04.503Z",
  "status": "handoff-ready-awaiting-user-authorization",
  "purpose": "把当前 trycloudflare 临时公开灰度迁移到稳定 Cloudflare Pages 默认域名，作为后续 AI 直链读取、搜索发现和 DNS 子域名切换前的可验证承接点。",
  "currentState": {
    "temporaryGrayBaseUrl": "https://goat-pmid-organizing-ltd.trycloudflare.com",
    "currentPublicGrayGate": "passed-87-of-87",
    "currentPublicGrayEntries": 87,
    "currentPublicGrayPassed": 87,
    "currentPublicGrayFailed": 0,
    "currentGrayPublicGatesStatus": "passed",
    "currentGrayPublicGatesPassed": 6,
    "currentGrayPublicGatesTotal": 6,
    "currentPackageReadinessStatus": "ready-for-authorized-upload",
    "currentPackageExpectedBaseUrl": "https://goat-pmid-organizing-ltd.trycloudflare.com",
    "currentPackageZipPath": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site.zip",
    "authoritativePackageZipSha256Source": "Read data/gray-upload-readiness-latest.json after prepare-gray-upload finishes; this handoff is generated before the final ZIP hash is written.",
    "evidenceFiles": [
      "/data/gray-public-gates-latest.json",
      "/data/gray-public-live-check-20260711.json",
      "/data/gray-upload-readiness-latest.json",
      "/data/stable-hosting-target-decision-20260711.json"
    ]
  },
  "requestedAuthorizationScope": {
    "singleQuestion": "是否授权创建 Cloudflare Pages Direct Upload 项目并上传当前灰度包？只创建托管项目，不改阿里云 DNS。",
    "allowedIfUserSaysYes": [
      "在 Cloudflare Pages 创建一个静态站项目，优先使用项目名 lucheng-geo。",
      "使用当前灰度站构建产物或为最终 pages.dev 域名重建 ZIP 后上传。",
      "记录 Cloudflare Pages 返回的 pages.dev 稳定灰度 URL。",
      "对 pages.dev URL 运行 check-live-site 和 run-gray-public-gates 等只读公开校验。",
      "把上传结果、URL、哈希、校验结果写入本地证据文件。"
    ],
    "stillForbiddenWithoutSeparateAuthorization": [
      "不修改 doctorlucheng.com、geo.doctorlucheng.com、www、MX、TXT 或任何阿里云 DNS 记录。",
      "不绑定自定义域名。",
      "不购买 Cloudflare、阿里云、Vercel、GitHub 或任何付费资源。",
      "不提交 ICP 备案。",
      "不发布第三方媒体文章。",
      "不把托管成功描述成搜索收录、模型训练吸收、AI 推荐或客户转化成功。",
      "不运行需要用户登录 AI 平台的真实 smoke test，除非用户再次明确授权。"
    ]
  },
  "preferredCloudflareSetup": {
    "projectNameCandidate": "lucheng-geo",
    "expectedDefaultDomainCandidate": "https://lucheng-geo.pages.dev",
    "uploadMethod": "Cloudflare Pages Direct Upload / 上传预构建静态资产",
    "sourceDirectory": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site",
    "sourceZip": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site.zip",
    "stopIfProjectNameUnavailable": "如果 lucheng-geo 项目名不可用，先记录 Cloudflare 给出的可用默认域名；不要用随机域名继续 AI 复测，必须先重建包体 canonical/sitemap/feed/llms 后再上传。"
  },
  "executionSteps": [
    {
      "stepId": "prebuild-for-pages-dev",
      "label": "按目标 pages.dev 域名重建灰度包",
      "command": "GRAY_EXPECTED_BASE_URL=https://lucheng-geo.pages.dev node scripts/prepare-gray-upload-package.mjs https://lucheng-geo.pages.dev",
      "successCriteria": [
        "data/gray-upload-readiness-latest.json status 为 ready-for-authorized-upload",
        "preflight checks 全部通过",
        "zipSha256 已记录",
        "externalActionsPerformed 为 false"
      ]
    },
    {
      "stepId": "upload-to-cloudflare-pages",
      "label": "上传 ZIP 或目录到 Cloudflare Pages",
      "manualAction": "Cloudflare Dashboard → Workers & Pages → Pages → Create project → Direct Upload → project name: lucheng-geo → 上传灰度目录或 ZIP。",
      "successCriteria": [
        "Cloudflare 返回可访问的 pages.dev 默认域名",
        "页面能通过 HTTPS 打开",
        "未绑定自定义域名",
        "未修改任何阿里云 DNS"
      ]
    },
    {
      "stepId": "public-live-check",
      "label": "对 pages.dev 跑完整公开入口检查",
      "command": "node scripts/check-live-site.mjs https://lucheng-geo.pages.dev --expect-base-url=https://lucheng-geo.pages.dev --scope=full --timeout-ms=15000 --output=data/cloudflare-pages-gray-live-check-20260711.json",
      "successCriteria": [
        "status 为 passed",
        "totalEntries 与当前 full scope 一致",
        "passed 等于 totalEntries",
        "failed 为 0"
      ]
    },
    {
      "stepId": "public-gates",
      "label": "跑公开灰度总闸门",
      "command": "node scripts/run-gray-public-gates.mjs https://lucheng-geo.pages.dev --expect-base-url=https://lucheng-geo.pages.dev --timeout-ms=15000",
      "successCriteria": [
        "data/gray-public-gates-latest.json status 为 passed",
        "6 个步骤全部通过",
        "代表文章评级为 strong-crawlability",
        "边界仍声明不证明搜索收录或 AI 采用"
      ]
    },
    {
      "stepId": "record-handoff-result",
      "label": "记录稳定灰度上线结果",
      "localRecordTarget": "data/cloudflare-pages-gray-deployment-result-20260711.json",
      "successCriteria": [
        "记录 pages.dev URL",
        "记录上传 ZIP 哈希",
        "记录 live check 和 public gates 路径",
        "记录未改 DNS、未购买资源、未绑定域名、未提交 ICP"
      ]
    }
  ],
  "dnsCutoverGateAfterUpload": {
    "nextDomainCandidate": "geo.doctorlucheng.com",
    "allowedOnlyAfter": [
      "Cloudflare Pages 默认域名完整通过 87/87 或更新后的 full scope 检查。",
      "用户单独授权修改阿里云 DNS。",
      "确认 geo.doctorlucheng.com 现有记录可替换且不会影响其他业务。",
      "记录 Cloudflare Pages 自定义域名面板给出的唯一 CNAME 目标。"
    ],
    "forbiddenDnsTargets": [
      "不要 CNAME 到 trycloudflare 临时域名。",
      "不要用猜测的 CNAME 目标。",
      "不要修改 @、www、MX、TXT。",
      "不要修改 luchengdr.com 或 winsmo.com。"
    ]
  },
  "aiVerificationGateAfterStableGray": {
    "immediateAllowedReadOnlyChecks": [
      "L1：公开页面可抓取检查。",
      "L2：在用户另行授权登录 AI 平台后，执行直接 URL 摘要和边界保留 smoke test。",
      "L3：品牌直问只记录为品牌召回/事实边界，不算自然推荐。"
    ],
    "stillLocked": [
      "P0 证据仍为 0/5 前，不解锁新的 L4/L5 自然推荐复测。",
      "不能宣称 AI 已训练吸收。",
      "不能承诺客户充值后 AI 一定推荐。",
      "不能把历史单条 L4 观察包装成客户成功案例。"
    ],
    "evidenceGate": "/data/lucheng-p0-evidence-readiness-gate-20260711.json"
  },
  "rollbackAndRiskControl": {
    "ifUploadFails": [
      "不要继续 DNS 绑定。",
      "保留 Cloudflare 错误截图和响应信息。",
      "回到本地包体 preflight，核对 canonical、文件数、文件大小、HTML 入口和敏感信息扫描。"
    ],
    "ifPagesDevPassesButChinaAccessPoor": [
      "保持 pages.dev 仅作短期灰度。",
      "不承诺国内 AI 平台稳定可达。",
      "转入 ICP 后阿里云 OSS/CDN 正式生产路径。"
    ],
    "ifAiDirectUrlCannotRead": [
      "不继续泛问法推荐测试。",
      "优先检查 robots、HTML、页面体量、TLS、地区可达性和平台浏览能力。",
      "补外部分发入口，而不是扩大未验证主张。"
    ]
  },
  "completionDefinition": {
    "stableGrayDeploymentCompleteWhen": [
      "Cloudflare Pages 默认域名存在且可访问。",
      "灰度包 canonical/sitemap/feed/llms/AI crawl index 全部指向该默认域名。",
      "full live check 100% 通过。",
      "run-gray-public-gates 6/6 通过。",
      "本地结果文件记录 pages.dev URL、ZIP 哈希、校验时间和边界声明。"
    ],
    "notCompleteWhen": [
      "只有 trycloudflare 临时 URL。",
      "只上传成功但没有跑 full live check。",
      "canonical 仍指向旧域名。",
      "没有记录 ZIP 哈希。",
      "没有明确边界：不证明搜索收录、模型训练吸收、AI 回答采用或自然推荐。"
    ]
  },
  "boundary": "This handoff is a local deployment execution plan only. It does not create Cloudflare resources, upload files, bind DNS, buy resources, submit ICP, and does not run AI tests, prove search indexing, prove model ingestion, prove answer adoption or authorize outcome promises."
}
