Skip to content

I3938 — The rustdoc composition case proves its composition on a small site, not on the whole one

Make test/cases/486_rustdoc_composition.sh prove the same relations (the topology composes the reference, the producer's absence is refused naming it, a second surface only the clone's topology declares is composed with no script changed, one path has one owner, and scripts/site-check refuses a build that lost the composition from sections 13m, 13d and 6) on a clone whose site is built in the source language alone, so that no build derives the whole second-language copy of the site.

READY wave 0 · p1 · implementation profile · parallel safe

Part of ci-critical-path — The critical path from a change to its verdict, and from a merge to its verified deploy, runs under a minute warm.

Ready. Every dependency is done, so majordomus plan start I3938 will be accepted.

Objective

Make test/cases/486_rustdoc_composition.sh prove the same relations (the topology composes the reference, the producer's absence is refused naming it, a second surface only the clone's topology declares is composed with no script changed, one path has one owner, and scripts/site-check refuses a build that lost the composition from sections 13m, 13d and 6) on a clone whose site is built in the source language alone, so that no build derives the whole second-language copy of the site.

Why

The case cost 4017 s on CI run 39762797718 (recorded 642 s on 2026-10-10) and is the slowest case of the suite, so it is the floor under every suite shard: no shard can finish faster than it. It runs scripts/site-build --no-data about ten times over a clone of the checkout, and each build renders the whole site and then derives a copy of it for every other declared language (`== languages`, scripts/lib/site-i18n.mjs, ADR 0218), although the case judges only the composition of published static surfaces from the committed topology (ADR 0086) and site-check's refusals.

Current state

Measured on one loaded machine (load average 25-100) on 2026-10-22: one full scripts/site-build --no-data of the clone took 625 s and published 5340 routes; the `== languages` step alone, rerun over that tree, took 755 s (6316 pages under /cs/), against 6 s for zola, 8 s for the docs index, 12 s for the diagrams and 6 s for copying the reference. Declaring the source language alone in the clone made the same build take 71 s (2670 routes) and scripts/site-check --no-sync over it passed clean. The case body replayed over such a clone (a driver script, outside the harness) ran every assertion to the end in 621 s on the same loaded machine, of which scripts/site-check, run three times, is the larger part. The case builds with the language copy every time, four of those builds render a site and two are followed by a site check.

Desired state

The case's clone declares the source language alone (site/i18n/languages.json, the one declaration the build, the language switch and the check read), keeps the file clean for git so the build records the clone as clean, and builds the two sites nobody checks afterwards without the stylesheet. Every assertion of the case still runs; no skip path is added; scripts/site-build, scripts/site-check and every other case are untouched.

Scope

  • test/cases/486_rustdoc_composition.sh

Out of scope

  • scripts/site-build and scripts/site-check, whose behaviour the case measures and does not change
  • Any other case, and the sharding of the suite
  • The cost of scripts/site-check itself (about 380 s on the loaded machine, mostly sections over the registry and the command line reference), which is now the larger part of the case and is its own change

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • The case's clone declares the source language alone and derives no language copy: no build of the case prints `== languages`
  • Every assertion of the case still executes: the number of expect_*, grep and refusal checks is unchanged or larger, and the case has no new skip_case path
  • scripts/site-build, scripts/site-check and every other case are unchanged by the change
  • On the same machine the case costs a small fraction of what it did before; the figures measured before and after are recorded on the pull request

Validation

  • bash test/run.sh 486_rustdoc_composition
  • scripts/ci/shell-lint
  • scripts/ci/english-only-check
  • bin/majordomus plan validate

Evidence required

  • rustdoc_composition_test

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3938.yaml. Read it back with majordomus plan show I3938.

Searches the titles and descriptions of every page this site publishes.