diff --git a/docs/reference/python-api/result-analysis.md b/docs/reference/python-api/result-analysis.md
index eb6a4e5189..bbebfe5c5b 100644
--- a/docs/reference/python-api/result-analysis.md
+++ b/docs/reference/python-api/result-analysis.md
@@ -609,7 +609,7 @@ Removes or replaces identifying data in results so they can be shared.
-**Returns:** `str`, an identifier used in anonymized results. The value may recur across related output and should not be treated as an anonymity or trust signal.
+**Returns:** `str`, an identifier used in anonymized results. The value recurs across related output and should not be treated as an anonymity or trust signal.
```python
from benchbox.core.results.anonymization import AnonymizationManager
@@ -660,7 +660,7 @@ True
-Anonymizes a tuning companion payload while preserving the corresponding identifier values used in the related result payload.
+Anonymizes a tuning companion payload with identifier values consistent with the related result payload.
| Name | Type | Default | Meaning |
| --- | --- | --- | --- |
diff --git a/tests/unit/scripts/test_site_parity.py b/tests/unit/scripts/test_site_parity.py
index d9d3c53058..986d4af54f 100644
--- a/tests/unit/scripts/test_site_parity.py
+++ b/tests/unit/scripts/test_site_parity.py
@@ -257,6 +257,20 @@ def test_project_allowance_preserves_legacy_atom_ids_and_allows_canonical_links(
assert allowed["canonical-atom-entry-links"]["owner_approval"] == "approved"
+def test_canonical_atom_allowance_rejects_id_loss_and_canonical_link_loss() -> None:
+ rules = site_inventory.load_allowed_differences(site_parity.DEFAULT_ALLOWED)
+ report = {kind: [] for kind in site_inventory.REPORT_KINDS}
+ report["feed regression"] = [
+ "/blog/atom.xml: entry https://benchbox.dev/blog/blog/a.html removed",
+ "/blog/atom.xml: entry https://benchbox.dev/blog/blog/a.html lost link /blog/a.html",
+ ]
+
+ remaining, allowed = site_inventory.apply_allowed_differences(report, rules)
+
+ assert allowed["canonical-atom-entry-links"] == []
+ assert remaining["feed regression"] == report["feed regression"]
+
+
def test_browser_failures_fail_the_report(tmp_path: Path) -> None:
baseline = _site(tmp_path / "base", theme=False, feed_link="/blog/a.html")
candidate = _site(tmp_path / "cand", theme=False, feed_link="/blog/a.html")
diff --git a/website/src/lib/atom.ts b/website/src/lib/atom.ts
index 0eb00b9b6a..ba4d7385ed 100644
--- a/website/src/lib/atom.ts
+++ b/website/src/lib/atom.ts
@@ -2,6 +2,7 @@ import { atomTimestamp, BLOG_BASE_URL, BLOG_TITLE, feedCategory, FEED_LENGTH, ne
const SITE_ORIGIN = "https://benchbox.dev";
const GENERATOR = { uri: "https://astro.build/", name: "Astro" };
+const LEGACY_FEED_ID_BASE = `${BLOG_BASE_URL}blog/`;
export function feedEntryUrl(post: Pick): string {
return `${BLOG_BASE_URL}${post.slug}.html`;
@@ -59,7 +60,7 @@ function summaryOf(post: BlogPost): string {
function entry(post: BlogPost): string {
const stamp = atomTimestamp(post.date);
- const entryId = `${BLOG_BASE_URL}blog/${post.slug}.html`;
+ const entryId = `${LEGACY_FEED_ID_BASE}${post.slug}.html`;
const url = feedEntryUrl(post);
const lines = [
" ",