{
  "schemaVersion": "0.1",
  "id": "public-gray-deployment-handoff-20260710",
  "name": "禄城 GEO 样板公开灰度部署执行交接件",
  "createdAt": "2026-07-10",
  "timezone": "Asia/Shanghai",
  "purpose": "把当前已准备好的灰度 zip、上线前校验、公开部署后门禁、四平台 smoke test 和证据记录动作整理成可执行交接件。该文件不授权外部发布、DNS 修改或账号操作。",
  "currentArtifact": {
    "zipPath": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site.zip",
    "siteDir": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site",
    "expectedBaseUrl": "https://lucheng-geo.pages.dev",
    "includeCname": false,
    "localPreflightRecord": "data/gray-package-preflight-latest.json",
    "publicPreflightBoundaryNote": "data/gray-package-preflight-public-note.json",
    "preflightCheckedAt": "see localPreflightRecord",
    "preflightStatus": "passed",
    "preflightChecks": 434,
    "preflightPassed": 434,
    "preflightFailed": 0,
    "zipEntries": "see localPreflightRecord",
    "zipSizeBytes": "see localPreflightRecord",
    "zipSha256": "see localPreflightRecord",
    "publicPackageExcludes": ["data/gray-package-preflight-latest.json"],
    "localLiveCheckRecord": "data/gray-local-live-check-20260710.json",
    "localLiveCheck": {
      "entries": 37,
      "passed": 37,
      "failed": 0,
      "totalBytes": 398704,
      "fetchBaseUrl": "http://127.0.0.1:4173",
      "expectedBaseUrl": "https://lucheng-geo.pages.dev"
    }
  },
  "recommendedRoute": {
    "id": "no-dns-static-hosting-gray",
    "label": "无 DNS 变更的静态托管默认域名灰度",
    "why": "最快得到公开 HTTPS URL；不改 doctorlucheng.com root/www；不影响备案、邮箱、官网旧业务；可直接验证 L1-L5。",
    "acceptableHosts": [
      "Cloudflare Pages 默认域名",
      "Vercel 默认域名",
      "Netlify 默认域名",
      "其他可上传静态目录并提供无路径 HTTPS origin 的平台"
    ],
    "urlRequirement": "必须是无路径 origin，例如 https://lucheng-geo.pages.dev；不要使用 https://owner.github.io/repo 这种带路径 URL。"
  },
  "authorizationBoundary": {
    "safeWithoutExtraApproval": [
      "读取本地文件",
      "生成/验证灰度部署包",
      "生成手工部署说明",
      "运行本地 live check"
    ],
    "requiresUserApproval": [
      "上传 zip 到 Cloudflare Pages、Vercel、Netlify 或其他外部托管平台",
      "登录第三方平台并创建项目",
      "修改 DNS",
      "绑定 doctorlucheng.com 或 geo.doctorlucheng.com",
      "购买云服务器、对象存储、CDN 或任何付费资源",
      "对外发布文章或提交 sitemap"
    ],
    "explicitlyNotDone": [
      "未公网部署 / not publicly deployed",
      "未修改 DNS",
      "未购买云服务器",
      "未向 AI 平台提交或测试本站 URL",
      "未声称 AI 已采用"
    ]
  },
  "manualUploadSteps": [
    {
      "step": 1,
      "name": "上传 zip 或目录",
      "instruction": "在静态托管平台新建项目，选择手动上传或导入静态目录，上传 currentArtifact.zipPath 或 currentArtifact.siteDir。",
      "mustNotDo": "不要绑定 doctorlucheng.com，不要修改现有 DNS。"
    },
    {
      "step": 2,
      "name": "记录公开灰度域名",
      "instruction": "拿到平台分配的无路径 HTTPS 域名，例如 https://lucheng-geo.pages.dev。",
      "mustNotDo": "不要使用带路径项目页作为 canonical。"
    },
    {
      "step": 3,
      "name": "如域名不是预设值则重建包",
      "instruction": "如果真实灰度域名不是 https://lucheng-geo.pages.dev，必须用真实域名重新运行 build-gray-deployment-site、package-gray-deployment-site 和 verify-gray-deployment-package。"
    },
    {
      "step": 4,
      "name": "跑公开门禁",
      "instruction": "公开 URL 可访问后，运行 postUploadCommands 中的命令。"
    },
    {
      "step": 5,
      "name": "通过后开始 AI smoke test",
      "instruction": "只有公开门禁通过后，才执行 24 条 smoke test；不要直接把矩阵计划当成 AI 采用证据。"
    }
  ],
  "postUploadCommands": [
    "node scripts/verify-gray-deployment-package.mjs --expected-base-url=https://lucheng-geo.pages.dev",
    "node scripts/run-gray-public-gates.mjs https://lucheng-geo.pages.dev",
    "node scripts/verify-gray-deployment.mjs https://lucheng-geo.pages.dev",
    "node scripts/check-live-site.mjs https://lucheng-geo.pages.dev --scope=full --timeout-ms=8000 --output=data/gray-public-live-check-20260710.json",
    "node scripts/verify-public-article-url.mjs https://lucheng-geo.pages.dev/articles/balcony-window-installation-acceptance-checklist.html --expect-text=禄城 --json",
    "node scripts/record-gray-crawlability-batch.mjs https://lucheng-geo.pages.dev --write --timeout-ms=10000"
  ],
  "ifRealGrayUrlDiffers": {
      "commands": [
        "node scripts/build-gray-deployment-site.mjs <真实公开灰度域名>",
        "node scripts/package-gray-deployment-site.mjs",
        "node scripts/verify-gray-deployment-package.mjs --expected-base-url=<真实公开灰度域名>",
      "node scripts/run-gray-public-gates.mjs <真实公开灰度域名>"
    ],
    "reason": "robots、sitemap、feed、llms、canonical 和 recordCommand 都必须与真实公开 URL 一致。"
  },
  "publicGatePassCriteria": [
    "首页 200",
    "robots.txt 200 且声明 sitemap",
    "sitemap.xml 200 且包含核心文章和机器可读 JSON",
    "feed.xml 200",
    "llms.txt 200",
    "data/ai-crawl-index.json 200",
    "第一批 8 个目标页 200",
    "代表文章 verify-public-article-url 通过",
    "record-gray-crawlability-batch 写入 8 条 public-page-crawlability 记录",
    "data/gray-public-gates-latest.json 生成且无失败项"
  ],
  "aiSmokeTestAfterGate": {
    "source": "data/gray-ai-smoke-test-20260708.json",
    "rowCount": 24,
    "platforms": ["豆包", "腾讯元宝", "通义千问", "DeepSeek"],
    "mustRecord": [
      "平台",
      "账号状态",
      "联网/搜索状态",
      "查询时间",
      "问题原文",
      "回答原文",
      "截图路径",
      "是否提到禄城",
      "是否采用页面事实",
      "是否引用 URL",
      "L2/L3/L4/L5 判定",
      "事实错误或危险推广"
    ],
    "minimumSuccessForNextPhase": [
      "至少 1 个平台完成 L2 直接 URL 读取",
      "没有出现严重事实错误",
      "若出现 L4 或 L5，则进入 120 条完整复测矩阵",
      "若只有 L2/L3，则补分发和内容，不宣称泛类目推荐成功"
    ]
  },
  "localCategoryL4L5RecordingAfterGate": {
    "source": "data/local-category-ai-adoption-sprint-20260710.json",
    "guide": "docs/LOCAL_CATEGORY_AI_RESULT_RECORDING_GUIDE_20260710.md",
    "helperCommand": "npm run record:local-category-ai -- --rowId=<rowId> --status=<status> --answerText=\"平台原始回答\"",
    "why": "公开门禁通过且用户继续授权真实 AI 测试后，用 rowId 记录助手减少 articleId/platform/queryType/question/screenshotPath 手工录错，并自动刷新 L4/L5 评估。",
    "boundary": "该记录助手只写本地证据台账；不打开浏览器、不上传、不发布、不证明 AI 已采用。"
  },
  "handoffDecisionNeeded": {
    "question": "是否授权将当前灰度包上传到一个无路径 HTTPS 默认域名并运行公开门禁？",
    "defaultRecommendation": "先使用无 DNS 变更的静态托管默认域名灰度。",
    "blockedExternalActions": [
      "上传 zip",
      "创建托管项目",
      "绑定域名",
      "修改 DNS",
      "购买付费资源"
    ]
  },
  "relatedFiles": [
    "docs/PUBLIC_GRAY_DEPLOYMENT_HANDOFF_20260710.md",
    "docs/GRAY_DEPLOYMENT_RUNBOOK_20260707.md",
    "docs/PUBLIC_TEST_HANDOFF_20260707.md",
    "local-only:data/gray-package-preflight-latest.json",
    "data/gray-package-preflight-public-note.json",
    "data/gray-local-live-check-20260710.json",
    "data/gray-local-live-check-20260708.json",
    "data/gray-ai-smoke-test-20260708.json",
    "data/local-category-ai-adoption-sprint-20260710.json",
    "docs/LOCAL_CATEGORY_AI_RESULT_RECORDING_GUIDE_20260710.md",
    "data/ai-adoption-evaluation-rubric-20260709.json",
    "data/startup-project-evaluation-20260709.json"
  ],
  "boundary": "This handoff makes deployment execution ready. It does not prove public crawlability, search discovery, AI adoption, model training absorption or brand recommendation."
}
