{
  "schemaVersion": "0.1",
  "id": "public-test-handoff-20260707",
  "name": "禄城 GEO 样板公开测试交接清单",
  "createdAt": "2026-07-07T19:03:27+08:00",
  "updatedAt": "2026-07-08T10:37:35+08:00",
  "timezone": "Asia/Shanghai",
  "purpose": "把当前项目从本地资产推进到公开 URL 验证和四平台 AI 采用复测的最短执行路径压缩成一页式交接清单。",
  "currentState": {
    "localValidation": {
      "command": "node scripts/validate.mjs",
      "status": "passed",
      "latestObservedResult": "验证通过：静态门户文件、结构化数据、监测数据和基础机器可读文件齐全。"
    },
    "doctorluchengPublicCheck": {
      "command": "node scripts/check-live-site.mjs https://lucheng-geo.pages.dev --scope=icp-review --timeout-ms=8000",
      "checkedAt": "2026-07-08T09:59:59+08:00",
      "status": "failed",
      "failedEntryCount": 9,
      "failureSummary": "首页、robots、sitemap、feed、产品页、证据中心和 3 个核心文章入口均 fetch failed。",
      "interpretation": "doctorlucheng.com 当前仍不能作为搜索引擎或 AI 平台抓取验证入口。"
    },
    "grayArtifact": {
      "status": "ready-local-artifact",
      "zipPath": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site.zip",
      "rebuiltAt": "2026-07-09T23:32:28+08:00",
      "sizeBytes": null,
      "size": "about 5.43MB; exact zip size is recorded in data/gray-package-preflight-latest.json",
      "sourceDirectory": "/Users/suweibin/Documents/Codex/2026-06-23/plugin-computer-use-openai-bundled-2/outputs/lucheng-geo-portal-gray-deploy-site",
      "currentExpectedGrayOrigin": "https://lucheng-geo.pages.dev",
      "localFullLiveCheck": "2026-07-08 local check passed: 37/37 entries returned 200; exact totalBytes is recorded in data/gray-local-live-check-20260708.json; expectedBaseUrl=https://lucheng-geo.pages.dev.",
      "zipContentSpotCheck": "Zip contains updated llms.txt, docs/PUBLIC_TEST_HANDOFF_20260707.md, docs/AI_ADOPTION_PROOF_MATRIX_20260708.md, reports/progress-audit-20260707.html, data/progress-audit-20260707.json, data/public-test-handoff-20260707.json, data/external-media-url-crawlability-20260708.json, data/ai-adoption-proof-matrix-20260708.json and sitemap.xml.",
      "localCrawlabilityDryRun": "data/gray-crawlability-batch-latest.json updated 2026-07-08T01:59:30.157Z: 8/8 target pages passed in dry-run mode; recordsWritten=0."
    },
    "grayPackagePreflight": {
      "status": "passed",
      "checkedAt": "2026-07-09T23:32:28+08:00",
      "record": "data/gray-package-preflight-latest.json",
      "checks": "see data/gray-package-preflight-latest.json",
      "passed": "see data/gray-package-preflight-latest.json",
      "failed": 0,
      "zipEntries": "see data/gray-package-preflight-latest.json"
    },
    "aiRetestMatrix": {
      "status": "ready-as-manual-test-worksheet",
      "json": "data/gray-ai-retest-matrix-20260707.json",
      "csv": "data/gray-ai-retest-matrix-20260707.csv",
      "rowCount": 120,
      "platforms": ["豆包", "腾讯元宝", "通义千问", "DeepSeek"],
      "boundary": "The matrix is not AI adoption evidence until raw platform answers, timestamps and screenshots are recorded."
    }
  },
  "minimumNextActions": [
    {
      "step": 1,
      "owner": "operator",
      "action": "Upload the gray zip or source directory to a no-path HTTPS static hosting origin such as Cloudflare Pages, Vercel or Netlify.",
      "preferredOriginShape": "https://lucheng-geo.pages.dev",
      "doNotUse": "https://owner.github.io/repo because current canonical/sitemap tooling assumes a no-path origin.",
      "externalWrite": true,
      "requiresUserOrOperatorAction": true
    },
    {
      "step": 2,
      "owner": "codex-or-operator",
      "action": "Run public gray verification immediately after upload.",
      "commands": [
        "node scripts/verify-gray-deployment-package.mjs --expected-base-url=https://lucheng-geo.pages.dev",
        "node scripts/verify-gray-deployment.mjs <公开灰度域名>",
        "node scripts/check-live-site.mjs <公开灰度域名> --scope=full --timeout-ms=8000",
        "node scripts/verify-public-article-url.mjs <公开灰度域名>/articles/balcony-window-installation-acceptance-checklist.html --expect-text=禄城 --json",
        "node scripts/record-gray-crawlability-batch.mjs <公开灰度域名> --write --timeout-ms=10000"
      ],
      "passCondition": "Package preflight passes; homepage, robots, sitemap, feed, llms, ai-crawl-index and 8 target pages return 2xx; record-gray-crawlability writes 8 public-page-crawlability records.",
      "externalWrite": false
    },
    {
      "step": 3,
      "owner": "codex-or-operator",
      "action": "Regenerate the four-platform retest matrix with the real public gray origin.",
      "command": "node scripts/build-gray-ai-retest-matrix.mjs <公开灰度域名>",
      "passCondition": "data/gray-ai-retest-matrix-20260707.csv uses the real public URL, not https://lucheng-geo.pages.dev unless that is the actual deployed origin.",
      "externalWrite": false
    },
    {
      "step": 4,
      "owner": "operator-with-logged-in-ai-platforms",
      "action": "Run AI retests on Doubao, Yuanbao, Qianwen and DeepSeek.",
      "evidenceRequired": [
        "platform",
        "question",
        "raw answer text",
        "query time",
        "screenshot path",
        "whether answer mentions 禄城精密门窗",
        "whether answer summarizes the target article",
        "whether answer cites or can access the target URL",
        "whether answer contains unsupported claims"
      ],
      "recordCommandTemplate": "Use the recordCommand column in data/gray-ai-retest-matrix-20260707.csv, replacing answerText and boolean fields with observed values.",
      "passCondition": "data/post-publish-ai-verification-records.json contains real records, then reports/post-publish-verification.html is regenerated.",
      "externalWrite": false
    }
  ],
  "decisionRules": {
    "ifGrayVerificationFails": [
      "Do not start AI retests.",
      "Fix static hosting, HTTPS, canonical, robots, sitemap or feed first.",
      "Rerun verify-gray-deployment until public URL passes."
    ],
    "ifAiCanOpenDirectUrlButDoesNotRecommendBrand": [
      "Record status as adopted-no-recommendation or referenced-without-brand-push, not success.",
      "Add source evidence, FAQ, distribution and retest later."
    ],
    "ifAiMentionsBrandWithoutUrlCitation": [
      "Record whether it appears to use article facts.",
      "Do not treat this as URL citation unless the platform explicitly links or quotes the target page."
    ],
    "ifGeoBb78ArticleUrlIsFound": [
      "Run npm run verify:article-url -- <url> --json.",
      "Run npm run pack:public-url -- <url> --label=<sample> --brand=禄城精密门窗 --category=门窗 --expect-text=禄城.",
      "Do not treat backend dashboard or report total as article-level proof."
    ]
  },
  "machineReadableBoundary": "This handoff proves only that the local artifact and test plan are ready. It does not prove public deployment, search discovery, AI model ingestion, AI answer adoption or brand recommendation."
}
