Skip to content

Release: Atlas Thesis and Ladder addresses, Russian Atlas, search and answer engines - #252

Merged
manager merged 2 commits into
mainfrom
release/atlas-ru-seo
Oct 13, 2026
Merged

manager merged 2 commits into
mainfrom
release/atlas-ru-seo

Conversation

@manager

@manager manager commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Atlas only, on top of production (#250). No OffSec, no CMS change, no new runtime key.

  • Thesis and Ladder get their own addresses: /ai-atlas/thesis, /ai-atlas/ladder (en, ru, hy).
  • Russian for the map, the Thesis and the Ladder.
  • 44px touch targets on board steps, ladder tiles and the modal close.
  • Per-page title, description, keywords, share picture (1200x630, en and ru) and JSON-LD: WebPage, Article for the Thesis, LearningResource plus a 16-rung ItemList for the Ladder, BreadcrumbList.
  • /ai-atlas-sitemap.xml with language alternates; robots.txt names it.
  • llms.txt and llms-full.txt carry an Atlas section; Thesis and Ladder as Markdown under /llms-full-pages/ai-atlas/.

Checked: tsc clean; a production build of the same Atlas files served all six pages with their own title, canonical, image and structured data, the sitemap, robots.txt, llms.txt, the Markdown pages and the pictures.

Authorized by Wolf on 2026-10-13.

🤖 Generated with Claude Code

… answer engines

- Thesis and Ladder get their own addresses (/ai-atlas/thesis, /ai-atlas/ladder).
- Russian for the map, the Thesis and the Ladder.
- 44px touch targets on board steps, ladder tiles and the modal close.
- Each Atlas page has its own title, description, share picture and
  structured data in English and Russian; /ai-atlas-sitemap.xml lists them.
- llms.txt and llms-full.txt carry an Atlas section; the Thesis and the
  Ladder are published as Markdown for answer engines.

No OffSec, no CMS change, no new runtime key. Authorized by Wolf on 2026-10-13.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Claude finished @manager's task in 28s —— View job


Review of PR #252 (Atlas Thesis/Ladder addresses, Russian, SEO)

I read the diff for src, scripts and the config files. I did not run tsc, a build or the E2E tests, and I did not open the generated llms* Markdown, the ru JSON or the PNGs. I relied on the PR description for those.

Overall: it looks sound. The tab pages reuse the existing page and static props, the Russian overlay is structural (words only, matched by id, English fallback), and the SEO helper is cleanly separated. SeoGenerator already supports schemaOverride, largeImage and the image size props, so the new usage fits. The translated row labels (k: text('rowInside') etc.) are not compared in code anywhere (only r.k === 'url' is), so they are safe to translate.

Issue (inline):

  • src/pages/ai-atlas-sitemap.xml.ts: toISOString() on a pushed generatedAt throws on an invalid date, which would make the sitemap a 500. Validate the date first, and ideally guard readStoredGuide() too.

Minor, no action required:

  • The sitemap leaves out hy, but the guide API revalidates /hy/... pages and the SEO helper builds /hy URLs. Armenian pages are English duplicates, so make sure their canonical points at the English page, or noindex them.
  • [tab].tsx imports from a sibling page module and uses any for the static props result. That is acceptable here but couples the two files.
  • The .wolf/ entry in .gitignore is unrelated to the PR; this looks like tooling noise that is harmless to keep.
  • The repo is public. The PR adds scripts/ai-atlas/* and ~3k lines of generated data. I did not check them against the internal-data guard.

Comment thread src/pages/ai-atlas-sitemap.xml.ts Outdated
];

export const getServerSideProps: GetServerSideProps = async ({ res }) => {
const guide = await readStoredGuide();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new Date(guide.generatedAt).toISOString() throws RangeError on an unparseable string, and generatedAt is pushed content. A bad value would turn the whole sitemap into a 500. Validate first, e.g. const d = new Date(guide.generatedAt); const lastmod = isNaN(d.getTime()) ? '' : .... Also consider a try/catch around readStoredGuide() so a storage hiccup still serves the URLs without lastmod.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in b160c02: the date is validated and an unreadable store only drops lastmod. The Armenian Atlas pages are kept off crawlers in robots.txt, since they show the English text. The new files passed the internal-data guard on commit.

The Atlas sitemap no longer fails when generatedAt is not a valid date or
the stored guide cannot be read. robots.txt keeps crawlers off the Armenian
Atlas pages, which show the English text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Claude finished @manager's task in 11s —— View job


Re-review of PR #252 after b160c02

The earlier sitemap finding is fixed in src/pages/ai-atlas-sitemap.xml.ts:25-29:

  • readStoredGuide() has a .catch(() => null), so a storage failure no longer breaks the sitemap.
  • generatedAt is parsed first and lastmod is dropped when the date is invalid, so a bad pushed value can no longer cause a 500.

I only re-read this file. I did not run tsc, a build or the E2E tests, and I did not re-read the rest of the diff since the last review.

Still open from the last review (no action required):

  • hy is not in the sitemap. Make sure the Armenian pages either canonicalize to the English page or are noindex.
  • The repo is public, so confirm scripts/ai-atlas/* and the generated data pass no-internal-data.mjs. The lint-staged hook should already have run it on commit.
  • The .gitignore entry for .wolf/ is unrelated to this PR but harmless.

Nothing else blocks the PR from my side. Merging still needs Wolf's go.

@manager
manager merged commit cbd70ec into main Oct 13, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant