Skip to content

Commit 3eab112

Browse files
Andyyesiyuclaude
andauthored
Stop the homepage from contradicting the survey's canonical record (#16)
Both pages emit a ScholarlyArticle under the @id the survey page owns, and consumers merge nodes by @id. The homepage copy still carried the provisional "A Survey of ..." title after the canonical page moved to the paper's real one, credited the lab as author where the canonical record lists 23 people, and trimmed the about list. The homepage entry now repeats only fields it matches verbatim and no longer defines an author. A cross-page test walks every field both nodes define and fails on any disagreement (bare @id references excepted) — this drift happened once and would have happened again on the next title change. Claude-Session: https://claude.ai/code/session_012BL7f2fJUYeiHQ1cUQXJGJ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 85f4bd1 commit 3eab112

2 files changed

Lines changed: 39 additions & 6 deletions

File tree

‎index.html‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,22 @@
113113
{
114114
"@type": "ScholarlyArticle",
115115
"@id": "https://simpleagentlab.com/ai4ai/#article",
116-
"name": "On the Eve of AI4AI: A Survey of Long-Horizon Agents and Recursive Self-Improvement",
116+
"name": "On the Eve of AI4AI: From Long-Horizon Agents to Recursive Self-Improvement",
117117
"url": "https://simpleagentlab.com/ai4ai/",
118-
"description": "A survey of AI4AI (AI for AI): how far an AI system can reliably carry an improvement process from idea to a validated result, with a taxonomy, a closure audit of 35 systems, and the composition gap.",
118+
"description": "A survey of AI4AI (AI for AI): how far an AI system can reliably carry an improvement process from idea to a validated result, a taxonomy for locating where the loop closes, a closure audit of 35 systems, and the composition gap that bounds recursive self-improvement.",
119119
"genre": "survey",
120120
"datePublished": "2026-08-12",
121121
"inLanguage": ["en", "zh-CN"],
122-
"author": {
123-
"@id": "https://simpleagentlab.com/#organization"
124-
},
125122
"publisher": {
126123
"@id": "https://simpleagentlab.com/#organization"
127124
},
128-
"about": ["AI4AI", "Long-horizon agents", "Recursive self-improvement"]
125+
"about": [
126+
"AI4AI",
127+
"Long-horizon agents",
128+
"Recursive self-improvement",
129+
"Self-improving systems",
130+
"Agent evaluation"
131+
]
129132
}
130133
]
131134
}

‎tests/test_seo.py‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,36 @@ def test_homepage_links_to_the_survey_with_descriptive_anchor_text(self):
161161
self.assertIn("A survey of AI4AI", text)
162162

163163

164+
class CrossPageConsistencyTests(unittest.TestCase):
165+
"""The homepage and /ai4ai/ both emit a ScholarlyArticle under one @id.
166+
Consumers merge nodes by @id, so any field both pages define must agree —
167+
this is exactly how the stale-title conflict slipped in once already."""
168+
169+
ARTICLE_ID = "https://simpleagentlab.com/ai4ai/#article"
170+
171+
def article_node(self, page):
172+
return next(
173+
node
174+
for node in json_ld_nodes(parse_head(page))
175+
if node.get("@id") == self.ARTICLE_ID
176+
)
177+
178+
def test_shared_fields_agree_and_authors_stay_canonical(self):
179+
canonical = self.article_node("ai4ai/index.html")
180+
homepage = self.article_node("index.html")
181+
for key in set(canonical) & set(homepage):
182+
ours, theirs = homepage[key], canonical[key]
183+
# A bare {"@id": ...} reference is compatible with the full node it
184+
# points at; only differing values are a conflict.
185+
if isinstance(ours, dict) and isinstance(theirs, dict):
186+
if ours.get("@id") and ours.get("@id") == theirs.get("@id"):
187+
continue
188+
self.assertEqual(ours, theirs, f"@id-merged field {key!r} conflicts")
189+
# The paper's byline is 23 people on the canonical page; the homepage
190+
# must not overwrite it with the lab as author.
191+
self.assertNotIn("author", homepage)
192+
193+
164194
class SitemapTests(unittest.TestCase):
165195
def test_every_indexable_page_is_listed_once(self):
166196
tree = ElementTree.parse(ROOT / "sitemap.xml")

0 commit comments

Comments
 (0)