Skip to content

I2661 — A publication that did not arrive is a finding the next reader meets, never a green step

Make the gap between 'the workflow succeeded' and 'the site serves the commit' visible where a lander looks, the minute it exists.

READY wave 0 · p1 · implementation profile · parallel safe

Part of M004 — Performance is executable evidence, and the hot path does no canonical work twice.

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

Objective

Make the gap between 'the workflow succeeded' and 'the site serves the commit' visible where a lander looks, the minute it exists.

Why

The owner, 2026-10-13: 'investigate what is slow ... solve it systemically, prevent it next time' and 'this must be analysed and solved through .ai/; it must not happen again'. Measured that day: a merge reached production 45 to 61 minutes later, and two landings of the evening were not served an hour after they merged.

Current state

Measured 2026-10-13 on pages runs 38451796942 and 38446047641: the step that waits for /build.json to name the commit (scripts/pages verify --timeout 600) ran 602 s both times, to its limit, and is continue-on-error, so the deploy job ended green while production served the previous commit. The pages-live gate reads the live site only on the next validation run, which waited in the same queue.

Desired state

When the wait ends without the site serving the commit, the run says so in its summary and as an annotation, the timing row records 'not served', and a deployment record names the commit production does serve; a lander's verification reads that record. The wait itself is no longer the whole bound when the cause is known to be a queue: it reports what GitHub's deployment is waiting for.

Scope

  • .github/workflows/pages.yml
  • scripts/pages
  • .ai/repo/ci/pages.yaml
  • docs/PAGES_STATUS.md
  • .ai/repo/project/issues/I2661.yaml

Out of scope

  • Failing the deploy job for a wait this repository does not control
  • Publishing by artifact, which is I2660

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • A run whose publication did not arrive within the bound is distinguishable from one that did without opening its log: summary, annotation and timing row
  • scripts/pages verify names what the site serves and, when GitHub's own deployment is queued, that it is queued and since when
  • A case breaks the wait with a site that never changes and proves each of the three signals

Validation

  • bin/majordomus plan validate
  • scripts/ci/shell-lint
  • bash test/run.sh <the new case>

Evidence required

  • not_served_is_visible_case
  • one_real_run_with_a_late_publication

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/I2661.yaml. Read it back with majordomus plan show I2661.

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