Skip to content

Land PROD-2552, PROD-2773, PROD-2782 on main (stacked PRs merged into their base branches) - #238

Merged
5PK merged 3 commits into
mainfrom
land/PROD-2552-2773-2782
Oct 14, 2026
Merged

5PK merged 3 commits into
mainfrom
land/PROD-2552-2773-2782

Conversation

@5PK

@5PK 5PK commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator

Why

#235, #236 and #237 were stacked: each one's base was the branch of the PR before it. Each was merged into that base branch instead of main, so only #234 (PROD-2542) reached main.

This PR lands the three already-reviewed commits on main, unchanged:

Please merge with "Rebase and merge" so the three commits stay separate on main.

Verification

Next: version bump to 1.1.2-beta.0 in a separate PR, then tag v1.1.2-beta.0.

🤖 Generated with Claude Code

5PK and others added 3 commits October 14, 2026 14:42
…s source

PROD-2552: verify comparison library (mapping index, neutral form, checks, report)

- mapping-index: Map-backed bidirectional indices over every mapping type, read-only
- canonicalize: neutral comparison form (target IDs, linked refs, asset URL
  translation and host aliasing, null/empty/CRLF/case/numeric normalization);
  shares no code with the push transforms
- checks: mapping integrity, models/containers/templates, content (fields,
  counts, list order), page fields and zones (section-ID or exact-name pairing,
  never positional), sitemap (parent, sibling order, missing)
- verify-report: findings, tallies, exit codes, console table, JSON report
- writeJsonSummary accepts any report object

PROD-2552: add `agility verify` command

Status guard (bounded 10-minute wait in preview and fetch mode, re-pull once
if an update lands during the pull), full pull of both instances, per-locale
checks, console + JSON report. Exit 0 pass, 1 differences, 2 could not verify.
Accepts only existing flags via a dedicated verifyArgs set; never writes to an
instance or to the mapping files. Also satisfies PROD-2549.

PROD-2552: document the verify command in the README

The required-field check (validate-required-fields.ts) is PROD-2542's (#234); this branch builds on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…her the source nor the target

PROD-2773: warn about asset URLs into a CDN container owned by neither instance

Content synced before the PROD-915 fix kept the upstream instance's CDN URLs,
so a source can reference a third instance's container (e.g. cdn-usa2.aglty.io/
upstream-qa/...). The asset mapping cannot map those, so they passed through
silently: image/file fields arrived empty on the target and rich-text links kept
pointing at the other instance.

The content pusher now scans each locale's syncable items (also in --preflight
and for unchanged items) and reports every foreign CDN URL once per run, with
the items/fields/locales using it. Reporting only: payloads, counts, success and
exit codes are unchanged.

- foreign-cdn-detector: pure URL extraction (aglty.io, azurewebsites origin,
  cdn*.agilitycms.com, learned custom edge hosts; JSON-escaped, &amp;, query and
  percent-encoded variants) and container-ownership check. Source/target
  containers come from asset mappings and pulled assets; nothing is reported
  while either side's container is unknown.
- foreign-cdn-report: per-run dedupe and rendering; attachment-field URLs are
  called out separately from text occurrences.
- Surfaces: logger warning on first sighting, end-of-run "Foreign CDN
  references: N URLs in M items" block, additive --jsonSummary warnings
  (code "foreignCdnReference", url, container, references), and a preflight
  warnings section that does not affect totals or the exit code.

Preflight totals now include PROD-2542's "invalid" count; the push test expects it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…puts it in staging

A page's zones are shared by all of its locales. When a save in one locale
adds, removes or reorders components, the server cuts a new page version and
gives every other language a staging row on it (ClearPageContent /
ReorderPageContent), so the page drops to Staging in its other locales.
--autoPublish only republished pages the run saved in that locale, so the
other locale stayed in Staging, and the PROD-2628 refresh then recorded its
new version as in sync, so later runs skipped it as up to date.

refreshOtherLocaleVersions already re-reads the page in each other locale of
the run after a save. It now records the page for republishing in that locale
when it was Published on the target when pulled, is Staging now, and is
Published on the source (a page left in staging on the source stays in
staging). executeAutoPublish adds those pages to that locale's publish list
(pages/both), de-duplicated, and updates their mappings as usual. A page whose
own save in that locale fails is never republished, whichever order the saves
ran in. Without auto-publish of pages, the run lists them as non-blocking
"staging" warnings in the console and --jsonSummary.

Locales not in the run are not checked: there is no pulled state for them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@5PK
5PK merged commit ba27a0d into main Oct 14, 2026
3 checks passed
@5PK
5PK deleted the land/PROD-2552-2773-2782 branch October 14, 2026 18:56
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.

2 participants