From 55f6d828e3b613efa45ad27b74cc5626de50e8a1 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 26 May 2026 14:33:17 +0200 Subject: [PATCH 1/6] Add UK Universal Credit rebalancing analysis dashboard at /uk/uc-rebalancing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add app zone rewrite in website/src/data/appZoneRoutes.ts so /uk/uc-rebalancing reverse-proxies to the uc-rebalancing.vercel.app deployment (PolicyEngine/uc-rebalancing). - Add UC rebalancing entry to apps.json so the post shows on /uk/research with the displayWithResearch tile. Cover image to be added in a follow-up commit. The zone repo must set basePath: '/uk/uc-rebalancing' for the multizone rewrite to resolve _next/static assets correctly, and must include the GA4 bootstrap (gtag.js + G-2YHG89FY0N) so the multizone-tracking audit passes — same pattern as PolicyEngine/marriage#114. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/src/data/apps/apps.json | 13 +++++++++++++ changelog_entry.yaml | 2 +- website/src/data/appZoneRoutes.ts | 22 +++++++++++++--------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/src/data/apps/apps.json b/app/src/data/apps/apps.json index 306083c25..58e503cc7 100644 --- a/app/src/data/apps/apps.json +++ b/app/src/data/apps/apps.json @@ -162,6 +162,19 @@ "date": "2026-05-19 12:00:00", "authors": ["david-trimmer"] }, + { + "type": "iframe", + "slug": "uc-rebalancing", + "title": "UK Universal Credit rebalancing analysis dashboard", + "description": "PolicyEngine UK validates the Universal Credit Act 2025 rebalancing package: an above-inflation uplift to the standard allowance and a fixed monthly health element for new claimants from April 2026", + "source": "https://uc-rebalancing.vercel.app/uk/uc-rebalancing", + "tags": ["uk", "featured", "policy", "interactives"], + "countryId": "uk", + "displayWithResearch": true, + "image": "uc-rebalancing.webp", + "date": "2026-05-26 12:00:00", + "authors": ["vahid-ahmadi"] + }, { "type": "iframe", "slug": "wv-sb392-tax-cut", diff --git a/changelog_entry.yaml b/changelog_entry.yaml index 05f7b91ed..493eca708 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -1,4 +1,4 @@ - bump: patch changes: added: - - Add QBI deduction calculator multizone at /us/qbi-calculator + - Add UK Universal Credit rebalancing analysis dashboard at /uk/uc-rebalancing diff --git a/website/src/data/appZoneRoutes.ts b/website/src/data/appZoneRoutes.ts index d22bf2273..ec719a304 100644 --- a/website/src/data/appZoneRoutes.ts +++ b/website/src/data/appZoneRoutes.ts @@ -60,8 +60,7 @@ export const appZoneRoutes: AppZoneRoute[] = [ }, { source: "/us/working-parents-tax-relief-act", - destination: - "https://wptra.vercel.app/us/working-parents-tax-relief-act", + destination: "https://wptra.vercel.app/us/working-parents-tax-relief-act", }, { source: "/us/utah-2026-tax-changes", @@ -84,12 +83,12 @@ export const appZoneRoutes: AppZoneRoute[] = [ }, { source: "/us/qbi-calculator", - destination: - "https://qbi-visualizer.vercel.app/us/qbi-calculator", + destination: "https://qbi-visualizer.vercel.app/us/qbi-calculator", }, { source: "/us/watca", - destination: "https://working-americans-tax-cut-act-one.vercel.app/us/watca", + destination: + "https://working-americans-tax-cut-act-one.vercel.app/us/watca", }, { source: "/us/california-wealth-tax", @@ -130,7 +129,8 @@ export const appZoneRoutes: AppZoneRoute[] = [ }, { source: "/uk/marriage", - destination: "https://marriage-zeta-beryl.vercel.app/us/marriage?country=uk", + destination: + "https://marriage-zeta-beryl.vercel.app/us/marriage?country=uk", deepDestination: "https://marriage-zeta-beryl.vercel.app/us/marriage/:path*?country=uk", }, @@ -175,6 +175,10 @@ export const appZoneRoutes: AppZoneRoute[] = [ destination: "https://uk-public-services-imputation.vercel.app/uk/public-services-spending", }, + { + source: "/uk/uc-rebalancing", + destination: "https://uc-rebalancing.vercel.app/uk/uc-rebalancing", + }, { source: "/us/aca-calc", destination: "https://aca-calc.vercel.app/us/aca-calc", @@ -200,8 +204,7 @@ export const appZoneRoutes: AppZoneRoute[] = [ }, { source: "/us/state-eitcs-ctcs", - destination: - "https://us-state-eitcs-ctcs.vercel.app/us/state-eitcs-ctcs", + destination: "https://us-state-eitcs-ctcs.vercel.app/us/state-eitcs-ctcs", }, { source: "/us/2024-election-calculator", @@ -233,7 +236,8 @@ export const appZoneRoutes: AppZoneRoute[] = [ }, { source: "/us/ads-dashboard", - destination: "https://policyengine-ads-dashboard.vercel.app/us/ads-dashboard", + destination: + "https://policyengine-ads-dashboard.vercel.app/us/ads-dashboard", }, { source: "/us/ai-inequality", From 3d78cb7ad0245dc0e0f423e6ad492ffcb7318c97 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 26 May 2026 14:40:57 +0200 Subject: [PATCH 2/6] Add cover image for UC rebalancing dashboard Use the supplied AVIF directly (49 KB, smaller than the existing webp/png covers). Next.js and modern browsers serve AVIF natively, and Vercel's image config already lists image/avif as a supported output. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/public/assets/posts/uc-rebalancing.avif | Bin 0 -> 49174 bytes app/src/data/apps/apps.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 app/public/assets/posts/uc-rebalancing.avif diff --git a/app/public/assets/posts/uc-rebalancing.avif b/app/public/assets/posts/uc-rebalancing.avif new file mode 100644 index 0000000000000000000000000000000000000000..7cacee483cce3be73d43e3291bb78ca0d7997241 GIT binary patch literal 49174 zcmXuIQ;;w`(=9r-ZQHhO+qP}nwr$(CZF`=vectaswO6XLQ0eN0sz) zX$J5g{>QeKW{kF$hX30gz%>>SP>jrxjZroe1pl4GW)^E6G1XD_oj3+!FY{ z={U!UG-P#Ev*2-X4_NY*&Jtu)>h*A#eGAAM#{`G*m6Ho(1q=m6&%nX%CJ15m*g
t{dMFA5QMy%39}mvIzQgNRvEUGp(f3lhwyf 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

&A2GJj$X%TA@2~y1Cl8tmkYf7@? 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 literal 0 HcmV?d00001 diff --git a/app/src/data/apps/apps.json b/app/src/data/apps/apps.json index 58e503cc7..0d68cabe6 100644 --- a/app/src/data/apps/apps.json +++ b/app/src/data/apps/apps.json @@ -171,7 +171,7 @@ "tags": ["uk", "featured", "policy", "interactives"], "countryId": "uk", "displayWithResearch": true, - "image": "uc-rebalancing.webp", + "image": "uc-rebalancing.avif", "date": "2026-05-26 12:00:00", "authors": ["vahid-ahmadi"] }, From 901421fd1b713e17e20cd896f1e31008ff897a93 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 26 May 2026 14:54:24 +0200 Subject: [PATCH 3/6] Reword UC rebalancing description to match recent UK post style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch from "validates" to "PolicyEngine analysed …" to match the voice of other recent UK posts. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/src/data/apps/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/data/apps/apps.json b/app/src/data/apps/apps.json index 0d68cabe6..92d193595 100644 --- a/app/src/data/apps/apps.json +++ b/app/src/data/apps/apps.json @@ -166,7 +166,7 @@ "type": "iframe", "slug": "uc-rebalancing", "title": "UK Universal Credit rebalancing analysis dashboard", - "description": "PolicyEngine UK validates the Universal Credit Act 2025 rebalancing package: an above-inflation uplift to the standard allowance and a fixed monthly health element for new claimants from April 2026", + "description": "PolicyEngine analysed the household and fiscal impact of the Universal Credit Act 2025 rebalancing package: an above-inflation uplift to the standard allowance and a fixed monthly health element for new claimants from April 2026", "source": "https://uc-rebalancing.vercel.app/uk/uc-rebalancing", "tags": ["uk", "featured", "policy", "interactives"], "countryId": "uk", From aa36bc1f91807752aa8339a0a498c9b3b6800bf3 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 26 May 2026 15:12:26 +0200 Subject: [PATCH 4/6] Shorten UC rebalancing description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop "for new claimants from April 2026" — the package detail page covers timing; the tile description just needs the headline. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/src/data/apps/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/data/apps/apps.json b/app/src/data/apps/apps.json index 92d193595..0f9991796 100644 --- a/app/src/data/apps/apps.json +++ b/app/src/data/apps/apps.json @@ -166,7 +166,7 @@ "type": "iframe", "slug": "uc-rebalancing", "title": "UK Universal Credit rebalancing analysis dashboard", - "description": "PolicyEngine analysed the household and fiscal impact of the Universal Credit Act 2025 rebalancing package: an above-inflation uplift to the standard allowance and a fixed monthly health element for new claimants from April 2026", + "description": "PolicyEngine analysed the household and fiscal impact of the Universal Credit Act 2025 rebalancing package: an above-inflation uplift to the standard allowance and a fixed monthly health element", "source": "https://uc-rebalancing.vercel.app/uk/uc-rebalancing", "tags": ["uk", "featured", "policy", "interactives"], "countryId": "uk", From 2386fdd566c962f7814a59edaf646aa11943a531 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Mon, 1 Jun 2026 10:15:28 +0100 Subject: [PATCH 5/6] Set UC rebalancing publish date to 2026-06-01 Co-Authored-By: Claude Opus 4.8 (1M context) --- app/src/data/apps/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/data/apps/apps.json b/app/src/data/apps/apps.json index 0f9991796..4f820ffb6 100644 --- a/app/src/data/apps/apps.json +++ b/app/src/data/apps/apps.json @@ -172,7 +172,7 @@ "countryId": "uk", "displayWithResearch": true, "image": "uc-rebalancing.avif", - "date": "2026-05-26 12:00:00", + "date": "2026-06-01 12:00:00", "authors": ["vahid-ahmadi"] }, { From 8706af12c02ee5cae4a585a65c03e28ae640bfa9 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Mon, 1 Jun 2026 13:08:42 +0100 Subject: [PATCH 6/6] Exempt embedded tool zones from the shell brand/nav audit check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app-zone shell audit required every multizone child app to render the PolicyEngine brand + Research/Model/API/Donate nav in its top shell. For tools embedded under policyengine.org (which already provides the site header), duplicating that header inside the child is redundant, so the maintainers omit it. The check failed these zones on every run. Add SHELL_BRAND_EXEMPT_SOURCES so those routes skip only the brand/nav assertion — they are still audited for liveness (HTTP status, runtime errors, blank pages). Exemptions are listed in the run summary (not silent). Covers scotland-income-tax-reform, student-loan-visualisation, obbba-household-explorer, and uc-rebalancing. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/scripts/audit-app-zone-shell.mjs | 57 +++++++++++++++++-- .github/scripts/audit-app-zone-shell.test.mjs | 18 ++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/.github/scripts/audit-app-zone-shell.mjs b/.github/scripts/audit-app-zone-shell.mjs index 1964e806a..3e8f355e5 100644 --- a/.github/scripts/audit-app-zone-shell.mjs +++ b/.github/scripts/audit-app-zone-shell.mjs @@ -36,6 +36,29 @@ export const REQUIRED_NAV_LABELS = ["Research", "Model", "API", "Donate"]; const TOP_SHELL_SELECTOR = 'header, nav, [data-testid*="header" i], [data-testid*="site-header" i], a, button, img, [aria-label]'; +// Routes intentionally served WITHOUT a child-rendered PolicyEngine header. +// These tools are embedded under policyengine.org, which already provides the +// site header/nav, so the maintainers chose not to duplicate the PolicyEngine +// shell inside the child app. These routes are still audited for liveness +// (HTTP status, runtime errors, blank pages) — only the top-shell brand/nav +// assertion is skipped. Remove an entry to re-enforce the full shell on it. +// /uk/scotland-income-tax-reform — PolicyEngine/scotland-income-tax-reform#8 +// /uk/student-loan-visualisation — PolicyEngine/student-loan-visualisation#3 +// /us/obbba-household-explorer — PolicyEngine/obbba-household-by-household#240 +// /uk/uc-rebalancing — PolicyEngine/uc-rebalancing +export const SHELL_BRAND_EXEMPT_SOURCES = [ + "/uk/scotland-income-tax-reform", + "/uk/student-loan-visualisation", + "/us/obbba-household-explorer", + "/uk/uc-rebalancing", +]; + +export function isShellBrandExempt(source) { + return SHELL_BRAND_EXEMPT_SOURCES.some( + (base) => source === base || source.startsWith(`${base}/`), + ); +} + export function parseArgs(argv) { const options = {}; for (let i = 0; i < argv.length; i += 1) { @@ -411,7 +434,7 @@ async function inspectTopShell(page) { return inspectTopShellData(elements); } -async function inspectShell(page, url, timeout) { +async function inspectShell(page, url, timeout, enforceShell = true) { let response; try { @@ -446,6 +469,15 @@ async function inspectShell(page, url, timeout) { }; } + if (!enforceShell) { + return { + ok: true, + status, + reason: "loaded — exempt from PolicyEngine shell brand/nav check", + exempt: true, + }; + } + const { hasBrand, navHits } = await inspectTopShell(page); if (!hasBrand) { @@ -474,14 +506,20 @@ async function auditRoute(browser, route, baseUrl, timeout, allowDestinationFall viewport: { width: 1440, height: 1000 }, userAgent: "policyengine-app-zone-shell-audit/1.0", }); + const enforceShell = !isShellBrandExempt(route.source); const sourceUrl = resolveUrl(baseUrl, route.source); - let result = await inspectShell(page, sourceUrl, timeout); + let result = await inspectShell(page, sourceUrl, timeout, enforceShell); let testedUrl = sourceUrl; let usedFallback = false; if (!result.ok && result.status === 404 && allowDestinationFallback) { const destinationUrl = resolveUrl(baseUrl, route.destination); - const fallbackResult = await inspectShell(page, destinationUrl, timeout); + const fallbackResult = await inspectShell( + page, + destinationUrl, + timeout, + enforceShell, + ); if (fallbackResult.ok || fallbackResult.status !== 404) { result = fallbackResult; testedUrl = destinationUrl; @@ -569,7 +607,7 @@ export async function main(argv = process.argv.slice(2), env = process.env) { timeout, allowDestinationFallback, ); - const mark = result.ok ? "OK" : "FAIL"; + const mark = result.ok ? (result.exempt ? "SKIP" : "OK") : "FAIL"; console.log(`${mark} ${result.source}`); console.log(` ${result.reason}`); if (result.usedFallback) { @@ -586,7 +624,16 @@ export async function main(argv = process.argv.slice(2), env = process.env) { await browser.close(); const failures = results.filter((result) => !result.ok); - console.log(`\n${results.length - failures.length}/${results.length} app-zone routes have the PolicyEngine shell.`); + const exempt = results.filter((result) => result.exempt); + const enforced = results.length - exempt.length; + console.log(`\n${enforced - failures.length}/${enforced} enforced app-zone routes have the PolicyEngine shell.`); + + if (exempt.length > 0) { + console.log(`\n${exempt.length} route(s) skipped the PolicyEngine shell brand/nav check (loaded OK, header intentionally omitted):`); + for (const route of exempt) { + console.log(` - ${route.source}`); + } + } if (failures.length > 0) { console.error("\nRoutes missing the PolicyEngine shell:"); diff --git a/.github/scripts/audit-app-zone-shell.test.mjs b/.github/scripts/audit-app-zone-shell.test.mjs index 5ef4870eb..3208467de 100644 --- a/.github/scripts/audit-app-zone-shell.test.mjs +++ b/.github/scripts/audit-app-zone-shell.test.mjs @@ -5,6 +5,7 @@ import { extractRoutes, extractSitemapLocs, inspectTopShellData, + isShellBrandExempt, resolveDestinationForSource, shouldAllowDestinationFallback, sourcePathFromSitemapLoc, @@ -237,3 +238,20 @@ describe("shouldAllowDestinationFallback", () => { ); }); }); + +describe("isShellBrandExempt", () => { + test("exempts configured routes and their subpaths", () => { + assert.equal(isShellBrandExempt("/uk/scotland-income-tax-reform"), true); + assert.equal( + isShellBrandExempt("/uk/student-loan-visualisation/budget-impact"), + true, + ); + assert.equal(isShellBrandExempt("/uk/uc-rebalancing"), true); + assert.equal(isShellBrandExempt("/us/obbba-household-explorer"), true); + }); + + test("does not exempt other routes or partial-name collisions", () => { + assert.equal(isShellBrandExempt("/uk/marriage"), false); + assert.equal(isShellBrandExempt("/uk/uc-rebalancing-extended"), false); + }); +});