Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions .github/workflows/website-production-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,25 @@ jobs:
fi
done

for path in robots.txt sitemap.xml llms.txt llms-full.txt zh-cn/llms.txt zh-tw/llms.txt ja/llms.txt; do
for path in robots.txt sitemap.xml feed.xml llms.txt llms-full.txt zh-cn/llms.txt zh-tw/llms.txt ja/llms.txt .well-known/security.txt; do
code="$(curl --silent --show-error --max-time 30 --output /dev/null --write-out '%{http_code}' "${origin}/${path}")"
if [ "$code" != "200" ]; then
echo "::error::/${path} returned HTTP ${code}"
failures=$((failures + 1))
fi
done

not_found="$(mktemp)"
not_found_code="$(curl --silent --show-error --max-time 30 --output "$not_found" --write-out '%{http_code}' "${origin}/definitely-not-a-readmd-page")"
if [ "$not_found_code" != "404" ]; then
echo "::error::404 handler returned HTTP ${not_found_code}, expected HTTP 404"
failures=$((failures + 1))
fi
if ! grep -q 'Official homepage' "$not_found" || ! grep -q '/release-notes/' "$not_found"; then
echo "::error::404 handler omits recovery entry points"
failures=$((failures + 1))
fi

for image in media/overview-reader.png media/overview-editor.png media/convert-home.png; do
response="$(curl --silent --show-error --max-time 30 --head "${origin}/${image}")"
if ! printf '%s\n' "$response" | grep -qi '^HTTP/[0-9.]* 200'; then
Expand All @@ -73,4 +84,4 @@ jobs:
echo "::error::Production check failed with ${failures} failures"
exit 1
fi
echo "Verified ${#routes[@]} routes, four language corpora families, robots, sitemap, and PNG social assets at ${origin}."
echo "Verified ${#routes[@]} routes, four language corpora families, Atom feed, security.txt, quality 404, robots, sitemap, and PNG social assets at ${origin}."
66 changes: 66 additions & 0 deletions showcase/reports/broad_seo_approval.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{
"schema_version": 1,
"artifact": "Broad technical SEO layer: entity graph, Atom distribution, international signals, crawl budget, trust file, and quality 404",
"reviewed_at": "2026-08-26T07:00:00Z",
"required_rounds": 3,
"minimum_score": 9.7,
"rounds": [
{
"round": 1,
"reviewer": "technical-seo-review",
"status": "approved",
"score": 9.89,
"evidence": [
"All 44 canonical pages expose enriched WebPage, SoftwareApplication, Organization, WebSite, offer, screenshot, releaseNotes, license, language, and publisher entities.",
"Release-notes pages additionally expose TechArticle entities with version, authorship, dates, license, and software relationships.",
"The validator now treats these requirements as regression contracts rather than one-time recommendations."
]
},
{
"round": 2,
"reviewer": "international-distribution-review",
"status": "approved",
"score": 9.86,
"evidence": [
"A valid full-site Atom feed contains exactly 44 canonical entries with titles, summaries, self and homepage links.",
"Every page links the feed and exposes four Open Graph locale signals.",
"robots.txt excludes parameter URLs while retaining explicit AI and search crawler allowances."
]
},
{
"round": 3,
"reviewer": "trust-quality-review",
"status": "approved",
"score": 9.82,
"evidence": [
"security.txt publishes contact, expiry, preferred languages, and canonical trust fields.",
"The static 404 handler is noindex and routes users to verified homepage, download, workflow, release-note, and localized entry points.",
"Raster images use async decoding; CSP JSON-LD hash was regenerated after entity enrichment."
]
}
],
"final_decision_meeting": {
"status": "approved_for_staged_publication",
"score": 9.87,
"participants": [
"technical SEO",
"international distribution",
"trust quality"
],
"conditions": [
"CI must pass before merge.",
"Production check must validate feed.xml, security.txt, 404 behavior, and all canonical routes.",
"IndexNow must be resubmitted after successful deployment."
]
},
"validation_evidence": {
"website_validator": "44 canonical pages; entity graph, Atom feed, security.txt, and quality 404 checks pass",
"browser_smoke": {
"file": "showcase/reports/broad_seo_browser_smoke.json",
"routes": 44,
"failures": 0
},
"csp_json_ld_hash_updated": true,
"robots_directive": "index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1"
}
}
Loading
Loading