[ ] src/web/layout.ts emits <link rel="canonical"> on every page that answers 200, with the same absolute URL as og:url (query strings that do not change the content dropped). Error pages emit none (the comment at layout.ts ~588 already says so).
[ ] The canonical entry is removed from WHY in test/forge-webspec.test.ts and the test passes.
[ ] A test asserts canonical == og:url on /, /explore and a repository page, and no canonical on a 404.
Files: src/web/layout.ts, test/forge-webspec.test.ts.
Risk: tests that pin the exact head bytes need the new line; name them in the pull.
Part of #2915.
Done looks like:
<link rel="canonical">on every page that answers 200, with the same absolute URL asog:url(query strings that do not change the content dropped). Error pages emit none (the comment at layout.ts ~588 already says so).canonicalentry is removed from WHY in test/forge-webspec.test.ts and the test passes.Files: src/web/layout.ts, test/forge-webspec.test.ts. Risk: tests that pin the exact head bytes need the new line; name them in the pull.