From a191e198ed9d855652460a83303c8a579267256a Mon Sep 17 00:00:00 2001 From: Mist Architect Date: Tue, 7 Jul 2026 03:15:55 +0800 Subject: [PATCH 1/2] Tune About search snippet wording --- CONTEXT.md | 42 +++++++++++++++++++++++++++++++++ docs/DEVELOPMENT_LOG.md | 39 ++++++++++++++++++++++++++++++ docs/SEO.md | 40 +++++++++++++++++++++++++++---- src/app/[locale]/about/page.tsx | 4 ++-- src/content/site.ts | 11 +++++---- tests/e2e/home.spec.ts | 20 +++++++++++++++- 6 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 CONTEXT.md diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..7b196cd --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,42 @@ +# Mist Architect Website Context + +This context defines project-specific language for the Mist Architect website, +especially around search visibility and client-facing content decisions. + +## Language + +**Search Result Snippet**: +The short summary text that a search engine shows below a result title, which may come from meta descriptions, visible page copy, or search-engine rewriting. +_Avoid_: subtitle, Bing subtitle, fixed description + +**Meta Description**: +The page-level metadata description exposed in HTML to suggest a search summary. +_Avoid_: guaranteed search result text + +**Visible Intro Copy**: +The concise public-facing introductory copy near the top of a page. +_Avoid_: hidden SEO text, keyword block + +## Relationships + +- A **Meta Description** may influence a **Search Result Snippet**, but does not guarantee it. +- A **Search Result Snippet** may be rewritten from **Visible Intro Copy** when the search engine considers the page text more relevant. +- **Visible Intro Copy** is client-facing website content and requires owner approval before material wording changes. +- Contact availability may be mentioned in a **Search Result Snippet**, but direct phone numbers, email addresses, and street addresses should remain on the contact page rather than being targeted for snippet display. +- For `/zh/about` and `/en/about`, the desired **Search Result Snippet** direction is business-clear first: explain what the studio does before expressing brand atmosphere. +- Chinese and English About summaries should stay semantically aligned, with the English page carrying a natural translation of the approved Chinese direction. +- About summary wording should retain the founders, **Cheng Bo** and **Li Bo**, after the studio location and service focus rather than leading with founder identity. + +## Example dialogue + +> **Dev:** "Should we change the Search Result Snippet directly?" +> **Domain expert:** "We cannot set it directly. We can adjust the Meta Description and, where approved, the Visible Intro Copy that Bing may use." + +## Flagged ambiguities + +- "副标题内容" was used for the red-box text in Bing results; resolved: this means **Search Result Snippet**, not page title, site name, sitelinks, or a guaranteed metadata field. +- `/zh/about` visible introductory wording may be adjusted conservatively to influence the **Search Result Snippet**, but not as hidden SEO text or broad brand repositioning. +- Contact information in search summaries was clarified: target wording may mention that contact details are available, but should not try to expose direct phone, email, or street address in the **Search Result Snippet**. +- `/zh/about` and `/en/about` target summary tone was resolved as business-clear rather than primarily poetic or brand-atmospheric. +- English About summary wording should reflect the updated Chinese direction rather than diverging into a different positioning. +- Founder information was retained in the target About summary, but placed after the business/service description. diff --git a/docs/DEVELOPMENT_LOG.md b/docs/DEVELOPMENT_LOG.md index 7085500..5fdb760 100644 --- a/docs/DEVELOPMENT_LOG.md +++ b/docs/DEVELOPMENT_LOG.md @@ -4,6 +4,45 @@ This log is written for both human developers and future coding agents. Keep ent short, dated, and implementation-oriented so the next contributor can understand what changed, why it changed, how it was checked, and what remains open. +## 2026-07-07 / About Search Result Snippet Wording + +### Goals + +- Improve the likely Bing search result snippet for `/zh/about` after Bing + showed a snippet assembled from About navigation and visible intro text. +- Keep the change conservative, owner-approved, and aligned across Chinese and + English About pages. + +### Changes + +- Added `CONTEXT.md` terms for Search Result Snippet, Meta Description, and + Visible Intro Copy so future SEO work does not treat Bing snippets as a + guaranteed metadata field. +- Updated `/zh/about` metadata and visible intro copy with a business-clear + studio summary covering Shenzhen context, design scope, founders, project + archive, contact availability, and WeChat MIST-ARCH. +- Updated `/en/about` metadata and visible intro copy with semantically aligned + English wording while keeping the metadata description within a Bing-friendly + length. +- Preserved the boundary that direct phone numbers, email addresses, and street + addresses should not be targeted for search snippet display. +- Added Playwright coverage for the About metadata and visible intro wording. +- Updated `docs/SEO.md` with search result snippet guidance and expected About + description lengths. + +### Verification + +- `npm run typecheck`: passed. +- `npm run lint`: passed. +- `npm run build`: passed. +- `npm run test:e2e`: passed, 9 Chromium tests. +- `git diff --check`: passed. + +### Deployment + +- No preview deploy, production deploy, Bing/Webmaster action, or production + credential/account operation was performed. + ## 2026-06-06 / Bing URL Inspection Follow-up ### Goals diff --git a/docs/SEO.md b/docs/SEO.md index 570e519..2e9d105 100644 --- a/docs/SEO.md +++ b/docs/SEO.md @@ -1,6 +1,6 @@ # SEO Implementation -Last updated: 2026-06-06, Asia/Shanghai. +Last updated: 2026-07-07, Asia/Shanghai. This document records how technical SEO is implemented for `https://mist-arch.com`, where to maintain it, and how to verify search-engine @@ -130,6 +130,32 @@ zh: 岚·建筑设计是由程博、李博创立的建筑事务所,专注建 en: MIST Architects is a Shenzhen architecture studio working across cultural spaces, interiors, adaptive reuse, and public architecture. ``` +### Search result snippets + +The text shown below a Bing result title is a search result snippet. The site +can influence it through `meta description`, visible page copy, headings, and +structured data, but Bing may rewrite the snippet from the rendered page when +it considers visible text more relevant to the query. + +For `/zh/about` and `/en/about`, the About metadata and first visible intro +copy should stay semantically aligned. The approved direction is +business-clear first: identify the studio, Shenzhen context, design scope, and +founders before more atmospheric brand language. + +Current About snippet targets: + +```text +zh/about: +岚·建筑设计是一家立足深圳的建筑事务所,关注建筑、室内、城市更新、公共文化与商业空间设计,由程博、李博共同创立。官网收录项目作品、团队介绍、媒体经历、联系方式与微信公众号 MIST-ARCH。 + +en/about: +MIST Architects is a Shenzhen studio for architecture, interiors, adaptive reuse, public cultural and commercial spaces, founded by Cheng Bo and Li Bo. +``` + +Do not target direct phone numbers, email addresses, or street addresses for +snippet display. It is acceptable to mention that contact details and WeChat +are available on the site. + ## 5. Canonical and hreflang Localized canonical URLs are generated with: @@ -371,7 +397,7 @@ for (const url of urls) { NODE ``` -Expected current production values: +Expected deployed values for the current source: ```text / -> /zh returns 308 @@ -380,15 +406,21 @@ Expected current production values: /sitemap.xml returns 200 /robots.txt returns 200 /en description length is 133 -/en/about description length is 127 +/zh/about description length is 96 after this About snippet update is deployed +/en/about description length is 151 after this About snippet update is deployed public pages should normally have empty alt count 0 ``` ## 12. Current Search State Notes -As of 2026-06-06: +As of 2026-07-07: - Bing has indexed `https://mist-arch.com/zh`. +- An owner-provided Bing screenshot for the `岚建筑` query showed + `https://mist-arch.com/zh/about` with a snippet partly assembled from About + page navigation and visible intro copy. The About page now uses + business-clear metadata plus visible intro wording to influence future Bing + snippets after crawl refresh. - `https://mist-arch.com/en/about` was known to Bing as `Discovered but not crawled` in URL Inspection. - `/en` SEO/GEO warnings for meta description length and one missing image alt diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx index a14fd5f..adf32f1 100644 --- a/src/app/[locale]/about/page.tsx +++ b/src/app/[locale]/about/page.tsx @@ -32,8 +32,8 @@ export async function generateMetadata({ params }: AboutPageProps): Promise { }); test.describe("about contact interactions", () => { + test("Chinese about page exposes the approved search summary wording", async ({ page }) => { + await page.goto("/zh/about#intro"); + + const description = + "岚·建筑设计是一家立足深圳的建筑事务所,关注建筑、室内、城市更新、公共文化与商业空间设计,由程博、李博共同创立。官网收录项目作品、团队介绍、媒体经历、联系方式与微信公众号 MIST-ARCH。"; + + await expect(page.locator('meta[name="description"]')).toHaveAttribute( + "content", + description + ); + await expect(page.locator("#intro")).toContainText(description); + }); + test("WeChat public account opens the QR code dialog", async ({ page }) => { await page.goto("/en/about#contact"); const metaDescription = page.locator('meta[name="description"]'); + const descriptionText = + "MIST Architects is a Shenzhen studio for architecture, interiors, adaptive reuse, public cultural and commercial spaces, founded by Cheng Bo and Li Bo."; + await expect(metaDescription).toHaveAttribute( "content", - "Learn about MIST Architects' studio, founders, services, awards, WeChat public account MIST-ARCH, QR code, and contact details." + descriptionText ); const description = await metaDescription.getAttribute("content"); expect(description?.length ?? 0).toBeLessThanOrEqual(155); + await expect(page.locator("#intro")).toContainText(descriptionText); + await expect(page.locator("#intro")).toContainText("WeChat MIST-ARCH"); const structuredData = await page .locator('script[type="application/ld+json"]') From 02b2c99f6a6f43c5c9375e35de4e942e78fbd901 Mon Sep 17 00:00:00 2001 From: Mist Architect Date: Wed, 8 Jul 2026 01:26:52 +0800 Subject: [PATCH 2/2] Add GEO foundation --- AGENTS.md | 2 + README.md | 1 + docs/AGENT_HANDOFF.md | 1 + docs/DEVELOPMENT_LOG.md | 47 ++++++ docs/GEO_PLAN.md | 166 ++++++++++++++++++++ docs/SEO.md | 63 +++++++- next-env.d.ts | 2 +- playwright.config.ts | 8 +- public/llms.txt | 48 ++++++ src/app/[locale]/journal/page.tsx | 6 +- src/app/[locale]/projects/page.tsx | 6 +- src/lib/seo.ts | 239 ++++++++++++++++++++++++++++- tests/e2e/home.spec.ts | 62 ++++++++ 13 files changed, 633 insertions(+), 18 deletions(-) create mode 100644 docs/GEO_PLAN.md create mode 100644 public/llms.txt diff --git a/AGENTS.md b/AGENTS.md index cfd91ea..74862be 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,6 +16,8 @@ Read these files in order before making changes: - `docs/IMAGE_PIPELINE.md` for OSS, responsive images, CDN, and image processing. - `docs/SEO.md` for search metadata, sitemap, robots, structured data, verification files, and search-engine submissions. + - `docs/GEO_PLAN.md` for AI-search visibility, crawler policy, `llms.txt`, + and citation monitoring. - `docs/DEPLOYMENT_PLAN.md` for Alibaba Cloud architecture decisions. - `docs/DEVELOPMENT_LOG.md` for chronological implementation history. diff --git a/README.md b/README.md index 08e1890..c75b2d7 100644 --- a/README.md +++ b/README.md @@ -161,5 +161,6 @@ See `docs/RELEASE_WORKFLOW.md`, `docs/CICD.md`, and - `AGENTS.md` is the entry file for coding agents. - `DESIGN.md` defines the current visual and interaction direction. +- `docs/GEO_PLAN.md` defines the AI-search / generative-engine visibility plan. - `docs/IMAGE_PIPELINE.md` documents OSS image processing and CDN guard rails. - `docs/DEVELOPMENT_LOG.md` records implementation and deployment history. diff --git a/docs/AGENT_HANDOFF.md b/docs/AGENT_HANDOFF.md index d3dff15..54c3c66 100644 --- a/docs/AGENT_HANDOFF.md +++ b/docs/AGENT_HANDOFF.md @@ -98,6 +98,7 @@ DESIGN.md Visual and interaction direction docs/RELEASE_WORKFLOW.md Local -> Preview -> Production flow docs/CICD.md GitHub Actions and deployment notes docs/SEO.md Technical SEO implementation and search submission notes +docs/GEO_PLAN.md AI-search visibility, crawler policy, and citation monitoring docs/IMAGE_PIPELINE.md OSS image pipeline and CDN guard rails docs/DEPLOYMENT_PLAN.md Alibaba Cloud architecture plan docs/DEVELOPMENT_LOG.md Chronological implementation log diff --git a/docs/DEVELOPMENT_LOG.md b/docs/DEVELOPMENT_LOG.md index 5fdb760..2385311 100644 --- a/docs/DEVELOPMENT_LOG.md +++ b/docs/DEVELOPMENT_LOG.md @@ -4,6 +4,53 @@ This log is written for both human developers and future coding agents. Keep ent short, dated, and implementation-oriented so the next contributor can understand what changed, why it changed, how it was checked, and what remains open. +## 2026-07-07 / GEO Foundation + +### Goals + +- Start the Generative Engine Optimization plan without changing the visible + site UI or inventing new project material. +- Make public production pages easier for AI/search systems to identify, + summarize, and cite accurately. + +### Changes + +- Added `docs/GEO_PLAN.md` with crawler policy, `llms.txt` boundaries, + measurement queries, content priorities, and release checks. +- Added root-served `public/llms.txt` as a concise canonical map for AI agents, + including key pages, core entities, citation boundaries, and crawler notes. +- Expanded Organization JSON-LD with visible service scope, service catalog, + areas served, awards, and founder descriptions. +- Expanded project JSON-LD with image arrays, project location, typology, + credit, visible fact properties, and section `hasPart` data for complete + project records. +- Added project-index `CollectionPage` / `ItemList` JSON-LD and Journal + `CollectionPage` / `BlogPosting` JSON-LD for archive-level GEO discovery. +- Made the Playwright local web server port configurable through + `PLAYWRIGHT_PORT` so e2e tests do not accidentally reuse another project on + port `3000`. +- Allowed Next's generated `next-env.d.ts` route-type import to follow the + current `next typegen` output path. +- Linked the new GEO plan from agent/readme/handoff documentation. +- Added Playwright coverage for `llms.txt`, Organization GEO fields, and + project citation facts. + +### Verification + +- `npm run typecheck`: passed. +- `npm run lint`: passed. +- `npm run build`: passed. +- `PLAYWRIGHT_PORT=3100 npm run test:e2e`: passed, 13 Chromium tests. +- `git diff --check`: passed. +- A default `npm run test:e2e` attempt initially reached another local project + already listening on port `3000`; the Playwright config now supports + `PLAYWRIGHT_PORT` for local collision-free runs. + +### Deployment + +- No preview deploy, production deploy, Bing/Webmaster action, or production + credential/account operation was performed. + ## 2026-07-07 / About Search Result Snippet Wording ### Goals diff --git a/docs/GEO_PLAN.md b/docs/GEO_PLAN.md new file mode 100644 index 0000000..94d14ac --- /dev/null +++ b/docs/GEO_PLAN.md @@ -0,0 +1,166 @@ +# Generative Engine Optimization Plan + +Last updated: 2026-07-07, Asia/Shanghai. + +This document defines the first GEO operating plan for `https://mist-arch.com`. +It builds on `docs/SEO.md`; it does not replace classic technical SEO. + +## 1. Objective + +Make MIST Architects discoverable and accurately citable in AI-assisted search +and answer engines while keeping the site calm, factual, bilingual, and aligned +with the existing release workflow. + +Success means: + +- AI/search crawlers can access canonical production pages. +- Public pages expose clear text, metadata, structured data, and internal links. +- AI-generated answers can cite the studio, founders, services, contact + channels, and completed project facts without guessing. +- Preview, localhost, credentials, and unpublished project material remain out + of public search surfaces. + +## 2. Current Baseline + +Implemented before this GEO plan: + +- Canonical production host: `https://mist-arch.com`. +- Localized entries: `/zh` and `/en`, with `/` permanently redirecting to + `/zh`. +- `robots.txt` allows public pages and disallows `/api/`. +- `sitemap.xml` lists localized static pages and project detail routes. +- Canonical URLs and `hreflang` alternates are generated from `src/lib/seo.ts`. +- Organization, WebSite, AboutPage, ContactPage, ImageObject, project, and + breadcrumb JSON-LD are emitted. +- Bing, Baidu, and IndexNow verification files are root-served from `public/`. +- Preview remains Basic Auth protected and should stay non-indexable at the + infrastructure layer. + +First GEO-specific additions: + +- `public/llms.txt` gives AI agents a concise, public, canonical map of the + site and warns against citing preview or unpublished facts. +- `src/lib/seo.ts` exposes richer Organization and project JSON-LD using + existing visible content: services, awards, areas served, project media, + location, credit, and fact properties. +- Project index and Journal routes emit `CollectionPage` / `ItemList` / + `BlogPosting` JSON-LD so list surfaces are also machine-readable citation + entry points. + +## 3. Official Guidance Boundary + +Use official sources when changing crawler or AI-search behavior: + +- Google Search AI features: foundational SEO still applies; pages must be + indexable and eligible for snippets; no special AI-only markup is required. +- OpenAI crawlers: `OAI-SearchBot` controls ChatGPT search visibility, while + `GPTBot` is a separate training-related control. +- Bing Webmaster Tools AI Performance: use cited pages, grounding queries, and + page-level citation data as monitoring signals. +- `llms.txt`: treat as an emerging, optional convention. It is useful as a + curated machine-readable site map, but it is not an access-control mechanism + and does not guarantee AI-search inclusion. + +## 4. Crawler Policy + +Current production intent: + +- Allow normal search indexing crawlers through the default `User-agent: *` + policy. +- Keep `OAI-SearchBot` allowed so ChatGPT search features can discover public + production pages. +- Do not add `GPTBot` or `Google-Extended` allow/disallow rules until the + project owner makes a specific content-use decision. +- Keep preview blocked through Basic Auth and `X-Robots-Tag: noindex` at the + infrastructure layer. + +Decision needed from the project owner: + +- Whether public production content may be used for model training, or whether + training-related bots such as `GPTBot` and controls such as + `Google-Extended` should be disallowed while keeping search retrieval allowed. + +## 5. Content Strategy + +GEO content should stay visible, factual, and useful to human visitors. + +Priority pages: + +- `/zh/about` and `/en/about`: entity grounding for studio name, founders, + services, awards, publications, WeChat, and contact details. +- `/zh/projects/field-academy` and `/en/projects/field-academy`: strongest + complete project record today. +- `/zh/projects` and `/en/projects`: index-level project typology and location + discovery. + +Next content batch: + +1. Complete `dream-factory-experimental-theater` with verified site, concept, + material, program, drawing, credit, and media facts. +2. Complete `wanzhi-natural-history-park` with verified exhibition, education, + circulation, and client/project facts. +3. Complete `bambu-lab-first-store` with verified retail, technology showroom, + product experience, and event-space facts. +4. Replace journal Unsplash placeholder images with OSS-hosted studio or + project imagery. +5. Add real journal articles that answer likely discovery queries about public + cultural architecture, adaptive reuse, retail experience space, and studio + process. + +Do not auto-generate full project sections from short seed copy. A project +should remain in the in-development fallback state until enough real material +exists for a sectioned narrative. + +## 6. Measurement Plan + +Weekly manual checks: + +- Google Search Console: indexing, page experience, Search performance. +- Bing Webmaster Tools: URL inspection, sitemap status, Site Scan, IndexNow, + and AI Performance when available. +- Baidu Search Resource Platform: verification, indexing, and push state. +- Production smoke checks for `/robots.txt`, `/sitemap.xml`, `/llms.txt`, + `/zh`, `/en`, `/zh/about`, `/en/about`, and key project pages. + +Representative GEO queries to track: + +- `岚建筑设计` +- `MIST Architects` +- `MIST-ARCH` +- `深圳 建筑事务所 公共文化空间` +- `Shenzhen architecture studio public cultural spaces` +- `MIST Architects WeChat` +- `岚建筑设计 公众号` +- `WILD WORKSHOP Suzhou architect` +- `苏州 钟家荡 原野学社 建筑师` + +Track: + +- Whether the answer cites `mist-arch.com`. +- Which page is cited. +- Whether the studio name, founders, services, location, and contact channels + are accurate. +- Whether a non-production host or unpublished project claim appears. + +## 7. Release Checklist + +Before an SEO/GEO commit: + +```bash +export NVM_DIR="$HOME/.nvm" +. "$NVM_DIR/nvm.sh" +npm run typecheck +npm run lint +npm run build +npm run test:e2e +git diff --check +``` + +After production promotion: + +- Smoke check `/robots.txt`, `/sitemap.xml`, and `/llms.txt`. +- Submit changed production URLs through IndexNow. +- Request inspection or indexing for changed high-value pages in Bing and + Google when appropriate. +- Update `docs/DEVELOPMENT_LOG.md`; update release IDs only when preview or + production release IDs actually change. diff --git a/docs/SEO.md b/docs/SEO.md index 2e9d105..d108661 100644 --- a/docs/SEO.md +++ b/docs/SEO.md @@ -90,9 +90,10 @@ src/app/robots.ts src/app/sitemap.ts ``` -Root-served verification and API files: +Root-served verification, GEO, and API files: ```text +public/llms.txt public/BingSiteAuth.xml public/baidu_verify_codeva-rzwTLycS3q.html public/f5775da6489b4079bb75b30bdd8fdbf9.txt @@ -188,11 +189,17 @@ The site emits JSON-LD through `src/lib/seo.ts`. Current structured data: -- `Organization` and `ArchitecturalService` on every localized layout +- `Organization` and `ArchitecturalService` on every localized layout, + including visible service scope, awards, areas served, and a service catalog - `WebSite` on every localized layout - `AboutPage` and `ContactPage` on `/zh/about` and `/en/about` - WeChat QR code `ImageObject` -- project `CreativeWork` on project detail pages +- project `CreativeWork` on project detail pages, including project image + arrays, location, typology, credit, and visible fact properties +- project index `CollectionPage` with an `ItemList` of project `CreativeWork` + entries on `/zh/projects` and `/en/projects` +- journal `CollectionPage` / `Blog` with `BlogPosting` entries on + `/zh/journal` and `/en/journal` - `BreadcrumbList` on project detail pages WeChat fields currently exposed in Organization JSON-LD: @@ -259,7 +266,40 @@ Host: https://mist-arch.com The sitemap includes localized alternate links and is revalidated every hour. -## 9. Verification Files +## 9. GEO and AI Search Controls + +GEO work is tracked in: + +```text +docs/GEO_PLAN.md +``` + +The root `llms.txt` file is served from: + +```text +https://mist-arch.com/llms.txt +``` + +`llms.txt` is a concise, public, machine-readable site map for AI agents. It +summarizes canonical URLs, key entities, high-value project pages, and citation +boundaries. It is not an access-control mechanism and does not guarantee +AI-search inclusion. + +Current crawler intent: + +- Keep normal public search crawling allowed through `User-agent: *`. +- Keep `OAI-SearchBot` allowed by default so ChatGPT search features can + discover public production pages. +- Do not add explicit `GPTBot` or `Google-Extended` rules until the project + owner decides whether public production content should be available for + model-training or product-specific grounding uses. +- Keep preview blocked from search through Basic Auth and infrastructure-level + `X-Robots-Tag: noindex`. + +When changing crawler policy, check current official docs before editing +`robots.txt`; crawler semantics are product-specific and can change. + +## 10. Verification Files Bing Webmaster Tools: @@ -285,7 +325,7 @@ public by design for IndexNow verification. Do not commit private API tokens, Baidu push tokens, webmaster account credentials, Basic Auth passwords, or SSH keys. -## 10. Search Engine Submission +## 11. Search Engine Submission ### Bing / IndexNow @@ -353,7 +393,7 @@ https://mist-arch.com/zh/about https://mist-arch.com/en/about ``` -## 11. Release Verification +## 12. Release Verification Run local checks before committing SEO code changes: @@ -375,6 +415,7 @@ curl -fsS -o /dev/null -w '%{http_code}\n' https://mist-arch.com/zh curl -fsS -o /dev/null -w '%{http_code}\n' https://mist-arch.com/en curl -fsS -o /dev/null -w '%{http_code}\n' https://mist-arch.com/sitemap.xml curl -fsS -o /dev/null -w '%{http_code}\n' https://mist-arch.com/robots.txt +curl -fsS -o /dev/null -w '%{http_code}\n' https://mist-arch.com/llms.txt ``` Check descriptions and empty alt attributes: @@ -405,13 +446,14 @@ Expected deployed values for the current source: /en returns 200 /sitemap.xml returns 200 /robots.txt returns 200 +/llms.txt returns 200 after this GEO foundation update is deployed /en description length is 133 /zh/about description length is 96 after this About snippet update is deployed /en/about description length is 151 after this About snippet update is deployed public pages should normally have empty alt count 0 ``` -## 12. Current Search State Notes +## 13. Current Search State Notes As of 2026-07-07: @@ -431,16 +473,21 @@ As of 2026-07-07: `/sitemap.xml` after production release `20260605194748-da9960e`. - IndexNow also accepted `/en/projects/field-academy` during the previous SEO cleanup release. +- A first GEO foundation update now adds `public/llms.txt`, + `docs/GEO_PLAN.md`, and richer Organization/project structured data using + existing visible site facts. Search visibility can lag after a successful technical fix. Bing, Baidu, and WeChat search may take days or longer to refresh snippets, indexing state, and ranking. -## 13. Maintenance Rules +## 14. Maintenance Rules - Keep SEO copy natural and brand-specific. - Keep canonical URLs on `https://mist-arch.com`. - Keep preview blocked from indexing. +- Keep `public/llms.txt` concise, public, and canonical-only; do not include + secrets, preview URLs, local paths, or unpublished project claims. - Add new public routes to `src/app/sitemap.ts` when they should be indexed. - Add route-specific metadata for new high-value pages. - Update JSON-LD when official contact, address, founder, WeChat, or QR code diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c..c4b7818 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/playwright.config.ts b/playwright.config.ts index efd8c7b..dfcc691 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,6 +1,8 @@ import { defineConfig, devices } from "@playwright/test"; const isCi = Boolean(process.env.CI); +const port = process.env.PLAYWRIGHT_PORT ?? "3000"; +const baseURL = `http://127.0.0.1:${port}`; export default defineConfig({ testDir: "./tests/e2e", @@ -8,12 +10,12 @@ export default defineConfig({ workers: 1, reporter: [["list"]], use: { - baseURL: "http://127.0.0.1:3000", + baseURL, trace: "on-first-retry" }, webServer: { - command: isCi ? "npm run start:standalone" : "npm run dev -- --hostname 127.0.0.1 --port 3000", - url: "http://127.0.0.1:3000/zh", + command: isCi ? "npm run start:standalone" : `npm run dev -- --hostname 127.0.0.1 --port ${port}`, + url: `${baseURL}/zh`, reuseExistingServer: !isCi, timeout: 120_000 }, diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..b7244dd --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,48 @@ +# MIST Architects + +> MIST Architects / 岚·建筑设计 is a Shenzhen architecture studio founded by Cheng Bo and Li Bo. The studio works across architecture, interiors, adaptive reuse, public cultural spaces, commercial spaces, exhibitions, retail environments, and spatial research. + +Canonical site: https://mist-arch.com +Primary languages: Chinese and English +Canonical localized home pages: https://mist-arch.com/zh and https://mist-arch.com/en +Canonical sitemap: https://mist-arch.com/sitemap.xml +WeChat public account: MIST-ARCH (岚建筑设计) +WeChat Channels: 岚建筑 + +## Key Pages + +- [Chinese home](https://mist-arch.com/zh): Main Chinese portfolio entry. +- [English home](https://mist-arch.com/en): Main English portfolio entry. +- [Chinese about](https://mist-arch.com/zh/about): Studio profile, founders, services, awards, publications, contact details, WeChat public account, and QR code. +- [English about](https://mist-arch.com/en/about): English studio profile, founders, services, awards, publications, contact details, WeChat public account, and QR code. +- [Chinese project index](https://mist-arch.com/zh/projects): Chinese archive of public, cultural, renewal, retail, interior, and spatial practice. +- [English project index](https://mist-arch.com/en/projects): English project archive. +- [Chinese journal](https://mist-arch.com/zh/journal): Studio news, design process, material research, and media records. +- [English journal](https://mist-arch.com/en/journal): English journal archive. +- [Sitemap](https://mist-arch.com/sitemap.xml): Canonical machine-readable list of localized public URLs. + +## Featured Project Pages + +- [WILD WORKSHOP / 苏州钟家荡原野学社](https://mist-arch.com/en/projects/field-academy): Completed rural public architecture cluster in Wujiang, Suzhou, with a library, small auditorium, tea pavilion, and research studio. +- [苏州钟家荡原野学社 / WILD WORKSHOP](https://mist-arch.com/zh/projects/field-academy): 完整中文项目档案。 +- [Dream Factory Experimental Theater](https://mist-arch.com/en/projects/dream-factory-experimental-theater): Youth experimental theater in Shenzhen. Detail material is still being organized on the website. +- [Wanzhi Tiandi Natural History Park](https://mist-arch.com/en/projects/wanzhi-natural-history-park): Cultural and exhibition environment in Shenzhen. Detail material is still being organized on the website. +- [Bambu Lab First Store](https://mist-arch.com/en/projects/bambu-lab-first-store): Retail and technology showroom in Shenzhen. Detail material is still being organized on the website. + +## Core Entities + +- Studio: MIST Architects / 岚·建筑设计 / 岚建筑设计 +- Founders: Cheng Bo and Li Bo +- Location: Shenzhen, Guangdong, China +- Contact email: info@mist-arch.com +- Phone: +86 186 1303 3310 +- Office: Room 702, Building B, Jihong R&D Building, No. 1 Binlang Road, Fubao Community, Fubao Subdistrict, Futian District, Shenzhen + +## Crawler And Citation Notes + +- Treat https://mist-arch.com as the canonical production host. +- Do not cite localhost, staging, preview, Basic Auth protected, or non-production hosts. +- Public production pages may be crawled for search retrieval when allowed by https://mist-arch.com/robots.txt. +- OAI-SearchBot access is intended to remain allowed so ChatGPT search features can discover public production pages. +- Training or product-specific crawler policy decisions, such as GPTBot or Google-Extended, should be checked against the current robots.txt and the project GEO plan before interpretation. +- Do not infer unpublished project facts, ICP filing numbers, client names, awards, or contact channels beyond what is visible on the canonical site. diff --git a/src/app/[locale]/journal/page.tsx b/src/app/[locale]/journal/page.tsx index 1ff6ac3..bd27108 100644 --- a/src/app/[locale]/journal/page.tsx +++ b/src/app/[locale]/journal/page.tsx @@ -5,7 +5,7 @@ import { JournalList } from "@/components/journal-list"; import { SectionRibbon } from "@/components/section-ribbon"; import { getJournalEntries } from "@/lib/content"; import { isLocale, type Locale } from "@/lib/i18n"; -import { buildPageMetadata } from "@/lib/seo"; +import { buildPageMetadata, journalIndexJsonLd, jsonLd } from "@/lib/seo"; export const revalidate = 60; @@ -51,6 +51,10 @@ export default async function JournalPage({ params }: JournalPageProps) { return (
+