LearnNewsExamplesServices
Frontmatter
id12522
titleCI guard: assert apps/portal SEO outputs (llms.txt/sitemap.xml) match learn/tree.json
stateClosed
labels
enhancementaibuild
assigneesneo-gpt
createdAtJun 4, 2026, 6:22 PM
updatedAtJun 5, 2026, 3:46 AM
githubUrlhttps://github.com/neomjs/neo/issues/12522
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 5, 2026, 3:46 AM

CI guard: assert apps/portal SEO outputs (llms.txt/sitemap.xml) match learn/tree.json

Closed v13.0.0/archive-v13-0-0-chunk-16 enhancementaibuild
neo-opus-ada
neo-opus-ada commented on Jun 4, 2026, 6:22 PM

Context

learn/tree.json has two downstream consumers: the portal learn-viewer nav, AND the checked-in public SEO/LLM outputs apps/portal/llms.txt + apps/portal/sitemap.xml (generated from tree.json by buildScripts/release/prepare.mjsgetSitemapXml/getLlmsTxt). A tree.json change that doesn't regenerate those leaves the public SEO surface stale (missing/extra URLs).

The Problem (recurrence)

This footgun has now hit two PRs in one session: #12512 (my learn/ prune — de-published audit URLs lingered in the SEO outputs; @neo-gpt's RA2) and #12521 (gpt's OwnAgentTeam guide — the new URL absent from the SEO outputs; my RA). The regeneration is a manual step that's easy to miss on any tree.json edit. Both reviewers caught it by hand — exactly the kind of friction CI should mechanize.

The Fix

A CI assertion (extend lint-tree-json or a sibling lint) that regenerates the SEO outputs in-memory from the current tree.json and fails if the checked-in apps/portal/llms.txt / apps/portal/sitemap.xml differ (modulo volatile fields like sitemap lastmod, which already has stable-fallback handling). Fail-message: "tree.json changed but SEO outputs are stale — regenerate via the prepare.mjs SEO step."

Acceptance Criteria

  • CI fails when apps/portal/llms.txt / sitemap.xml are out of sync with learn/tree.json (URL set), ignoring volatile lastmod.
  • Green on a correctly-regenerated tree; red on a tree.json leaf add/remove without SEO regen.
  • Unit test (positive + negative).

Related

Empirical: #12512 RA2 + #12521 RA (same class). Source: buildScripts/docs/seo/generate.mjs, buildScripts/release/prepare.mjs. Sibling tree.json guards: #12511/#12513.

Origin Session ID: c2800781-b204-4883-a52f-2979a560718b

tobiu closed this issue on Jun 5, 2026, 3:46 AM
tobiu referenced in commit ebb44e3 - "test(learn): guard SEO output sync (#12522) (#12523) on Jun 5, 2026, 3:46 AM