{
  "schemaVersion": "0.1",
  "id": "geo-subdomain-dns-cutover-plan-20260711",
  "generatedAt": "2026-07-14T03:30:04.443Z",
  "targetSubdomain": "geo.doctorlucheng.com",
  "targetBaseUrl": "https://lucheng-geo.pages.dev",
  "currentTemporaryGrayBaseUrl": "https://goat-pmid-organizing-ltd.trycloudflare.com",
  "sourceObservation": {
    "observedAt": "2026-07-11T04:01:00+08:00",
    "mode": "read-only-terminal-checks-no-dns-change-no-aliyun-change",
    "dns": {
      "geoDoctorluchengComA": [
        "198.18.5.71"
      ],
      "cnameObserved": false,
      "publicResolverConsistency": "local resolver、223.5.5.5、8.8.8.8、1.1.1.1 返回 198.18.5.71"
    },
    "http": {
      "url": "http://geo.doctorlucheng.com/",
      "ok": false,
      "result": "curl: (52) Empty reply from server"
    },
    "https": {
      "url": "https://lucheng-geo.pages.dev/",
      "ok": false,
      "result": "curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL；openssl no peer certificate available"
    }
  },
  "decision": {
    "status": "plan-ready-awaiting-user-authorization",
    "canModifyDnsNow": false,
    "canUseGeoSubdomainAsAiRetestTargetNow": false,
    "recommendedRoute": "Use geo.doctorlucheng.com as the first stable gray subdomain only after choosing a stable static host and confirming the existing 198.18.5.71 record can be replaced.",
    "doNotUseCurrentTrycloudflareAsCnameTarget": true,
    "reasonNotTrycloudflareCname": "The current trycloudflare URL is a temporary tunnel address suitable for short-lived public testing, not a stable custom-domain CNAME target for long-term AI discovery."
  },
  "recommendedDnsChangeAfterAuthorization": {
    "provider": "阿里云云解析 DNS",
    "domain": "doctorlucheng.com",
    "recordToChange": {
      "hostRecord": "geo",
      "currentObservedType": "A",
      "currentObservedValue": "198.18.5.71",
      "currentServiceStatus": "not-serving-http-or-https"
    },
    "preferredNewRecord": {
      "hostRecord": "geo",
      "type": "CNAME",
      "value": "由稳定静态托管平台提供，例如 Cloudflare Pages / GitHub Pages / Vercel / 阿里云 OSS+CDN 的自定义域名目标；不要填当前 trycloudflare 临时地址",
      "ttl": "600 seconds during cutover, later 3600 seconds after stable"
    },
    "alternativeNewRecord": {
      "hostRecord": "geo",
      "type": "A/AAAA",
      "value": "仅当托管平台明确提供固定 IP 时使用",
      "ttl": "600 seconds during cutover"
    },
    "unchangedRecords": [
      "@",
      "www",
      "luchengdr.com",
      "winsmo.com"
    ],
    "rollbackRecord": {
      "hostRecord": "geo",
      "type": "A",
      "value": "198.18.5.71",
      "note": "回滚只恢复到本次只读观察到的原状态；因该原状态本身不可服务，回滚目标只是避免扩大变更影响，不代表恢复业务可用。"
    }
  },
  "preChangeChecklist": [
    "在阿里云 DNS 控制台截图或导出现有 doctorlucheng.com 全部解析记录。",
    "确认 geo.doctorlucheng.com 当前 A 记录 198.18.5.71 是否有业务用途；如不确定，不改。",
    "选定稳定托管平台并取得正式自定义域名绑定目标。",
    "用 https://lucheng-geo.pages.dev 作为 base URL 重建灰度包，确认 canonical、sitemap、feed、llms、ai-crawl-index 一致。",
    "确认托管平台已准备好 SSL 证书签发流程。"
  ],
  "aliyunManualStepsAfterAuthorization": [
    "进入阿里云控制台 → 域名与网站 → 云解析 DNS。",
    "选择 doctorlucheng.com。",
    "找到主机记录为 geo 的现有记录，先截图保存记录类型、记录值、TTL、线路。",
    "如果稳定托管平台要求 CNAME：把 geo 记录改为 CNAME，记录值填托管平台提供的目标；TTL 暂设 600。",
    "如果稳定托管平台要求 A/AAAA：只填平台提供的固定 IP，不使用临时隧道 IP。",
    "保存后等待解析生效，再执行 dig、curl 和完整 live check。",
    "如果 30 分钟内 HTTPS、robots、sitemap、llms 任一关键入口不通过，按 rollbackRecord 恢复。"
  ],
  "postChangeVerification": {
    "dnsCommands": [
      "dig +short geo.doctorlucheng.com A",
      "dig +short geo.doctorlucheng.com CNAME",
      "dig @223.5.5.5 +short geo.doctorlucheng.com A",
      "dig @8.8.8.8 +short geo.doctorlucheng.com CNAME",
      "dig @1.1.1.1 +short geo.doctorlucheng.com CNAME"
    ],
    "httpCommands": [
      "curl -I -L --max-time 20 https://lucheng-geo.pages.dev/",
      "curl -sS -L --max-time 20 https://lucheng-geo.pages.dev/robots.txt",
      "curl -sS -L --max-time 20 https://lucheng-geo.pages.dev/sitemap.xml",
      "curl -sS -L --max-time 20 https://lucheng-geo.pages.dev/llms.txt"
    ],
    "projectCommands": [
      "GRAY_EXPECTED_BASE_URL=https://lucheng-geo.pages.dev node scripts/validate.mjs",
      "node scripts/check-live-site.mjs https://lucheng-geo.pages.dev --scope=full --timeout-ms=15000 --output=data/geo-subdomain-public-live-check-20260711.json",
      "node scripts/run-gray-public-gates.mjs https://lucheng-geo.pages.dev --expect-base-url=https://lucheng-geo.pages.dev --timeout-ms=15000"
    ],
    "passCriteria": [
      "HTTPS 首页 200 或 HTTP 301 到 HTTPS 后 200。",
      "robots.txt 包含 Sitemap: https://lucheng-geo.pages.dev/sitemap.xml。",
      "sitemap.xml、feed.xml、llms.txt、data/ai-crawl-index.json 均返回 200 且 base URL 一致。",
      "full live check 全部通过。",
      "代表文章达到 strong-crawlability。"
    ]
  },
  "aiRetestBoundary": {
    "afterGeoSubdomainPasses": "可先做 L2 直接 URL 读取和边界保留测试。",
    "stillLocked": [
      "P0 证据 0/5 通过前，不运行新一轮自然 L4/L5 推荐复测。",
      "不能声称 geo.doctorlucheng.com 已被搜索收录、模型训练吸收或自然推荐。",
      "不能销售 AI 收录、推荐、排序、模型认知改变或稳定转化承诺。"
    ]
  },
  "boundaries": [
    "This plan does not modify DNS, deploy a site, bind a domain, buy a server, submit ICP filing or run real AI tests.",
    "geo.doctorlucheng.com is currently not serving HTTP/HTTPS and must not be used as the official AI retest target until the post-change verification passes.",
    "A DNS cutover only creates a stable public URL prerequisite; it is not proof of search indexing, AI model ingestion, AI answer adoption or recommendation."
  ]
}
