Should I merge it now? Yes.
No remaining blocking findings in 8dda6fb483.
My earlier no applied to a8be95a5dd. That version skipped section content updates when the layout list and page colors stayed the same. The new commit forces a data rebuild when Angular reports a sections input change. It also prevents waiting layout loads from restarting after destroy.
The branding getter still returns its cached object when the values are unchanged. The loader still caches loaded components, so rebuilding section data does not require downloading the same layouts again.
Both findings are fixed
Section content now refreshes
ngOnChanges passes !!changes['sections'] to resolveSectionsOnce. That flag bypasses the resolve-key shortcut and rebuilds resolvedData and layout inputs. A published cover refresh can now replace headlines and images without changing the layout sequence.
I repeated the original heading reproduction against all three commits. The base returned the new heading. The first PR version returned the old heading. The updated PR returns the new heading.
Destroy stops waiting loads
ngOnDestroy sets previewDestroyed. The loader checks it before starting, after waiting for an existing load, and before writing results. The pending-task cleanup remains in finally.
With 20 section updates and waiting callers during one unfinished import, destroying the preview prevented a second load, a cache write, and any later change-detection notification. The original pending task was released.
Checks and limits
- Heading replacement passes on the updated commit. The same check still reproduces the regression on the earlier commit.
- Twenty content updates during an unfinished load keep one loader call, retain the latest heading, and release the pending task.
- The destroy variant makes no cache write or change-detection notification after destroy.
- Equal branding values avoid a false change. Changed branding reaches layout inputs.
- Clearing sections and restoring them rebuilds the displayed data.
- Angular compilation: Pass with
ngc --noEmiton a clean checkout of the reviewed commit, using the installed dependencies and a 10 GB heap. - The incremental diff passes the Git whitespace check.
The behavioral checks execute the exact component class from Git through TypeScript transpilation, with Angular services, color helpers, and layout loaders stubbed. They verify control flow and data propagation. They do not measure browser memory or validate rendered colors.
I did not run full main-project or generated white-label builds, SSR rendering, or a signed-in appearance-tab browser session for this update. The usual white-label smoke test should still cover an idle preview, a palette edit, and a published cover refresh. No content was published to a white-label site during this review.
GitHub reports the PR open and mergeable, with no listed status checks. Mergeability alone is not a test result.
Keep import failure handling as a follow-up
The batch still uses Promise.all. If one chunk rejects, the batch does not publish its successful results and there is no local retry or error state. This behavior predates this PR and is not a new merge blocker.