{
  "schemaVersion": "2.76",
  "lastModified": "2026-10-04",
  "canonical": "https://yangtsunghann.com/data/search-ai-launch-hardening.json",
  "registryType": "search_ai_launch_hardening",
  "status": "static_search_ai_hardening_pass_external_watch_items_open",
  "targetPublicLaunchDate": "2026-10-10",
  "purpose": "10/10 上線前最後一輪 Search / AI 收斂：縮短過長的英文搜尋摘要候選、消除重複 Person award signal、驗證 86 個重複 Person nodes 的身份一致性、重新確認 AI/search crawler 官方規則、更新公開 retrieval 與 Google Search Console priority snapshot。這一版不宣稱搜尋排名、跨平台 AI 引用率或 CDN/WAF bot 放行已被完整驗證。",
  "searchSnippetHardening": {
    "englishCoreDescriptionsShortened": 8,
    "maxEnglishTitleChars": 62,
    "maxEnglishDescriptionChars": 180,
    "englishDescriptionsOver180Chars": 0,
    "titlesUnique": true,
    "descriptionsUnique": true
  },
  "canonicalEntity": {
    "@id": "https://yangtsunghann.com/#artist",
    "repeatedPersonNodes": 86,
    "canonicalIdParity": "86/86",
    "coreIdentityCoverage": {
      "name": "86/86",
      "alternateName": "86/86",
      "url": "86/86",
      "sameAs": "86/86",
      "birthDate": "86/86",
      "birthPlace": "86/86",
      "nationality": "86/86",
      "workLocation": "86/86",
      "disambiguatingDescription": "86/86",
      "award": "86/86"
    },
    "signatureAwardNormalized": "86/86",
    "legacyDomainInSameAs": 0,
    "standalonePersonEntityIdentifier": "https://yangtsunghann.com/#artist",
    "knownNamesakeCollisionStillMaterial": true
  },
  "publicRetrievalProbe": {
    "probeDate": "2026-10-04",
    "method": "current public web retrieval sample across artist identity and artwork queries",
    "canonicalOfficialDomainObserved": true,
    "observedOfficialSurface": {
      "name": "藝術家簡介｜楊宗翰 Yang Tsung Han",
      "url": "https://yangtsunghann.com/biography/"
    },
    "artistAuthorityAnchorsObserved": [
      {
        "name": "Tokyo Foto Awards — Yang Tsung Han",
        "url": "https://www.tokyofotoawards.jp/interviews/yang-tsung-han/",
        "class": "official_award_interview"
      },
      {
        "name": "International Photo Awards — Tunnel At Night",
        "url": "https://photoawards.com/social/zoom.php?eid=8-174059-19",
        "class": "official_award_record"
      },
      {
        "name": "Moscow Foto Awards — Tunnel At Night",
        "url": "https://www.moscowfotoawards.com/winners/moscow/2019/4726/",
        "class": "official_award_record"
      },
      {
        "name": "Taipei Times — Local photographers grab top prizes at Moscow contest",
        "url": "https://www.taipeitimes.com/News/taiwan/archives/2019/05/30/2003716051",
        "class": "independent_editorial"
      },
      {
        "name": "PX3 — Tunnel at night",
        "url": "https://px3.fr/winners/hm/2018/1-83338-18/",
        "class": "official_award_record"
      },
      {
        "name": "ACCUPASS — 台灣達帕地景攝影新視點系列（二）",
        "url": "https://www.accupass.com/event/1901091324585148321570",
        "class": "institutional_event_archive"
      }
    ],
    "sameNameCollisionObserved": true,
    "collisionExample": {
      "name": "楊宗翰",
      "url": "https://www.pro360.com.tw/service/213475",
      "occupationSignal": "musician / music instructor",
      "mustRemainSeparate": true
    },
    "engineSpecificRankingMeasured": false,
    "exhaustiveInternetCoverageClaimed": false,
    "directClaudeGeminiPerplexityAnswerTested": false
  },
  "googleSearchConsole": {
    "checkedOn": "2026-10-04",
    "property": "sc-domain:yangtsunghann.com",
    "searchAnalytics": {
      "settledThrough": "2026-09-29",
      "aggregateLast28SettledDays": {
        "clicks": 5,
        "impressions": 37,
        "ctrPercent": 13.513513513513514,
        "averagePosition": 4.648648648648649
      },
      "visibleQueryRowsSample": [
        {
          "query": "藝術家",
          "clicks": 1,
          "impressions": 1,
          "ctrPercent": 100.0,
          "averagePosition": 3.0
        },
        {
          "query": "tunnel 24",
          "clicks": 0,
          "impressions": 1,
          "ctrPercent": 0.0,
          "averagePosition": 5.0
        },
        {
          "query": "tunnel2021",
          "clicks": 0,
          "impressions": 1,
          "ctrPercent": 0.0,
          "averagePosition": 8.0
        },
        {
          "query": "官網資訊",
          "clicks": 0,
          "impressions": 1,
          "ctrPercent": 0.0,
          "averagePosition": 1.0
        }
      ],
      "queryRowsAreCompleteTrafficBreakdown": false,
      "note": "Query-level Search Console rows can omit low-volume queries; the visible sample is not expected to sum to aggregate impressions."
    },
    "priorityInspections": [
      {
        "url": "https://yangtsunghann.com/",
        "verdict": "PASS",
        "coverageState": "Submitted and indexed",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_ALLOWED",
        "lastCrawlTime": "2026-10-03T07:58:57Z",
        "pageFetchState": "SUCCESSFUL"
      },
      {
        "url": "https://yangtsunghann.com/biography/",
        "verdict": "PASS",
        "coverageState": "Submitted and indexed",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_ALLOWED",
        "lastCrawlTime": "2026-10-03T09:13:45Z",
        "pageFetchState": "SUCCESSFUL"
      },
      {
        "url": "https://yangtsunghann.com/artwork/pixel-tunnel/",
        "verdict": "PASS",
        "coverageState": "Submitted and indexed",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_ALLOWED",
        "lastCrawlTime": "2026-10-03T23:16:34Z",
        "pageFetchState": "SUCCESSFUL"
      },
      {
        "url": "https://yangtsunghann.com/artwork/sck/",
        "verdict": "PASS",
        "coverageState": "Submitted and indexed",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_ALLOWED",
        "lastCrawlTime": "2026-10-03T06:05:50Z",
        "pageFetchState": "SUCCESSFUL"
      },
      {
        "url": "https://yangtsunghann.com/en/artwork/tunnel-of-four-seasons/01/",
        "verdict": "NEUTRAL",
        "coverageState": "Not found (404)",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_STATE_UNSPECIFIED",
        "lastCrawlTime": "2026-10-03T08:44:59Z",
        "pageFetchState": "NOT_FOUND",
        "status": "external_google_watch"
      },
      {
        "url": "https://yangtsunghann.com/bibliography/colors-of-memory/",
        "verdict": "NEUTRAL",
        "coverageState": "Crawled - currently not indexed",
        "robotsTxtState": "ALLOWED",
        "indexingState": "INDEXING_STATE_UNSPECIFIED",
        "lastCrawlTime": "2026-10-03T11:44:45Z",
        "pageFetchState": "SUCCESSFUL",
        "status": "external_google_watch"
      }
    ],
    "indexedPriorityRoutes": "4/6",
    "externalGoogleWatchItems": 2
  },
  "crawlerPolicy": {
    "officialDocsVerifiedOn": "2026-10-04",
    "providersVerified": [
      "OpenAI",
      "Google",
      "Anthropic",
      "Perplexity"
    ],
    "robotsPolicyChanged": false,
    "oaiSearchBot": "allowed",
    "gptBot": "disallowed",
    "googlebot": "allowed",
    "googlebotImage": "allowed",
    "googleExtended": "inherited_public_default",
    "claudeSearchBot": "allowed",
    "claudeBot": "inherited_public_default",
    "perplexityBot": "allowed",
    "cdnWafNamedBotAcceptanceVerified": false,
    "providerDocs": [
      {
        "provider": "OpenAI",
        "url": "https://developers.openai.com/api/docs/bots",
        "verified": "2026-10-04",
        "note": "OAI-SearchBot is for ChatGPT search; GPTBot is a separate foundation-model training crawler. Search visibility requires crawler access and may also depend on CDN/WAF acceptance."
      },
      {
        "provider": "Google",
        "url": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "verified": "2026-10-04",
        "note": "Googlebot controls Google Search crawling. Google-Extended is a separate product token; it does not control Search inclusion and covers Gemini model-training use plus Gemini/Vertex AI grounding."
      },
      {
        "provider": "Anthropic",
        "url": "https://support.anthropic.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "verified": "2026-10-04",
        "note": "Anthropic distinguishes ClaudeBot, Claude-SearchBot, and Claude-User. Claude-SearchBot is used for search-result quality; Claude-User is user-initiated retrieval."
      },
      {
        "provider": "Perplexity",
        "url": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "verified": "2026-10-04",
        "note": "PerplexityBot surfaces and links websites in Perplexity search results and is not used to crawl content for AI foundation models. Perplexity-User is user-initiated retrieval and generally ignores robots.txt."
      }
    ]
  },
  "releaseIntegrity": {
    "siteHtml": 88,
    "indexablePages": 84,
    "canonicalSitemapParity": true,
    "canonicalUrls": 84,
    "hreflangComplete": 84,
    "openGraphComplete": 84,
    "twitterMetadataComplete": 84,
    "invalidJsonLd": 0,
    "imageAltCoverage": "396/396",
    "imageDimensionCoverage": "396/396",
    "brokenInternalLinks": 0,
    "missingReferencedAssets": 0
  },
  "externalWatchItems": [
    {
      "id": "google-en-four-seasons-01",
      "priority": "P0 watch",
      "state": "Not found (404)",
      "lastCrawl": "2026-10-03T08:44:59Z",
      "note": "Current package route exists; re-inspect after deployment. Do not label current production broken solely from the old Google crawl."
    },
    {
      "id": "google-colors-of-memory",
      "priority": "P1 watch",
      "state": "Crawled - currently not indexed",
      "lastCrawl": "2026-10-03T11:44:45Z",
      "note": "Google fetch was successful; keep stable and observe."
    },
    {
      "id": "cdn-waf-ai-bot-acceptance",
      "priority": "infrastructure watch",
      "state": "not independently verified",
      "note": "robots.txt permissions are correct, but current CDN/WAF acceptance of named AI search bots has not been proven from logs or agent/IP validation."
    },
    {
      "id": "same-name-collision",
      "priority": "entity watch",
      "state": "material but defended",
      "note": "Unrelated same-name people remain visible publicly; canonical identity keys and third-party artist anchors are required."
    }
  ],
  "releaseGates": [
    {
      "id": "search_snippet_integrity",
      "status": "pass",
      "expected": "English indexable descriptions <=180 chars; titles/descriptions remain unique; OG/Twitter descriptions match core page intent."
    },
    {
      "id": "person_entity_consistency",
      "status": "pass",
      "expected": "86/86 repeated Person nodes use canonical @id, core identity signals and one normalized signature award; legacy domain absent from sameAs."
    },
    {
      "id": "canonical_discovery_integrity",
      "status": "pass",
      "expected": "84 canonical URLs exactly match 84 sitemap URLs; hreflang/OG/Twitter remain 84/84."
    },
    {
      "id": "crawler_policy_currency",
      "status": "pass",
      "expected": "OpenAI/Google/Anthropic/Perplexity official crawler documentation rechecked on 2026-10-04; policy choices unchanged."
    },
    {
      "id": "public_retrieval_identity",
      "status": "pass",
      "expected": "Current public retrieval sample observes canonical official domain plus independent artist authority; namesake collision remains explicit."
    },
    {
      "id": "google_priority_health",
      "status": "watch",
      "expected": "4 priority routes indexed/fetch-successful; two known Google watch items remain external-state observations."
    },
    {
      "id": "cdn_waf_named_bot_acceptance",
      "status": "watch",
      "expected": "No claim of named AI crawler acceptance until CDN/WAF or server evidence exists."
    },
    {
      "id": "cross_platform_ai_answer_visibility",
      "status": "not_measured",
      "expected": "Do not claim Claude/Gemini/Perplexity answer citation share without direct platform measurement."
    }
  ],
  "contentFreezeCandidate": true,
  "contentFreezeActivated": false,
  "nextRelease": "V2.75 — Analytics / Measurement Launch Baseline",
  "visiblePublicContentChanged": false,
  "analyticsLaunchBaseline": "/data/analytics-launch-baseline.json",
  "releaseCandidate": "/data/release-candidate.json",
  "publicLaunch": "/data/public-launch.json"
}
