# United Pets CI Pass — 2026-08-24

Goal: repair `themes/united-pets` until the canonical ThemeFactory verifier passes, then land to `main` and regenerate the distributable ZIP.

Base: `origin/main` at `ec860f667ef28900936c480bab81e85167a586a3`.

## Current state

- Isolated lane: `fix/united-pets-ci-pass-20260824`.
- Replaced legacy jQuery Form JSON fallback `window.eval("("+e+")")` with `JSON.parse(e)` in `assets/js/plugins-runtime.js`.
- Static rerun still fails `TF-STATIC-017` because dangerous packed `eval(...)` remains under the preserved source tree; package checks `TF-PKG-010/011` also fail as expected until the final ZIP is regenerated.
- Do not weaken verifier gates. Determine whether remaining packed LayerSlider sources are used; remove or replace them coherently.

## Known runtime backlog after static clears

- TF-DEMO-004 importer identity churn/non-idempotence.
- TF-FORM-002 unlabeled controls.
- TF-UI-002 / TF-UI-011 offscreen or zero-box keyboard-focusable controls.
- TF-UI-016 unequal declared card heights.
- TF-UI-019 distorted image aspect ratios.
- TF-UI-025 mobile comment form overflow.
- TF-PERF-004 missing intrinsic image dimensions.
- TF-RUNTIME-007 duplicate H1 on `/elements/`.
- Axe AA and focus-indicator accessibility failures.

## Repair milestone: centralized runtime/accessibility pass

- The six LayerSlider vendor files that tripped `TF-STATIC-017` were unpacked from their Dean Edwards `eval(...)` wrappers into their behavior-equivalent readable payloads; all six pass `node --check`. The live main LayerSlider/transitions paths will remain subject to runtime console/network gates.
- Normal demo import is now update-in-place rather than destructive reset/rebuild, preserving demo entity identities for `TF-DEMO-004`; the destructive reset helper remains internal but is no longer called by the normal import action.
- Source-section/archive/single serialization now adds deterministic accessible names to otherwise unnamed controls and server-side intrinsic `width`/`height` for source/attachment images.
- Owl inactive slides are removed from the tab order and marked `aria-hidden`; active-slide tabindex values are restored.
- Equal-height normalization now includes declared non-Owl archive card selectors as well as homepage carousel cards.
- WordPress integration CSS now provides ordinary `:focus` outlines, keeps interactive AOS targets visible/focusable, constrains comment controls to the viewport, and preserves feature/service image aspect ratios.
- Elements visual heading sample is no longer a second semantic H1.
- Debian1 syntax proof: changed PHP passes `php -l`; changed WordPress/runtime/vendor JavaScript passes `node --check`.
- Debian1 static proof after the patch: only `TF-PKG-010/011` fail, solely because `dist/united-pets.zip` is deliberately stale until source/runtime repairs are green. `TF-STATIC-017` remains cleared.
- Focused real-WordPress reruns are in progress on Debian1/2/3.

## Real-fixture proof after centralized repair

Focused pinned Podman/WordPress reruns produced these confirmed transitions:

- Debian1 `/tmp/up-repair2-import.json`: **RC 0** — `TF-DEMO-004`, `TF-FORM-002`, and `TF-RUNTIME-007` all pass. Demo import now preserves menu/front/blog identities across a second import; all checked controls are labelled; `/elements/` has exactly one H1 across the route matrix.
- Debian2 `/tmp/up-repair2-ui.json`: `TF-UI-002`, `TF-UI-019`, and `TF-UI-025` pass. Remaining at that checkpoint were only `TF-UI-011` zero-box Owl descendants and two timing-sensitive `TF-UI-016` adoption-height measurements.
- Debian3 `/tmp/up-repair2-a11y.json`: `TF-A11Y-005` passes. Remaining at that checkpoint: footer source logo missing intrinsic dimensions, Axe link/contrast findings, and vertical focus visibility.
- Repair iteration 3 adds the footer logo dimensions, zero-box Owl suppression, synchronous archive/card equalization, and a `focusin` visibility guarantee. Focused reruns are in progress.

## Repair iteration 3 proof

- Debian1 `/tmp/up-repair3-ui.json`: **RC 0** — `TF-UI-011` and `TF-UI-016` both pass across the full route/viewport traversal. Inactive/zero-box Owl descendants are no longer keyboard-focusable and declared adoption/blog/team/service equal-height invariants are green.
- Debian2 `/tmp/up-repair3-focus.json`: `TF-PERF-004` passes; the only remaining failure was `TF-A11Y-007` because `scrollIntoView()` did not update Chromium geometry synchronously enough inside the verifier's immediate post-focus measurement. Iteration 4 replaces that with numeric `window.scrollTo()`.
- Debian3 `/tmp/up-repair3-axe.json`: Axe failures are narrowed to exact text-link cases only. Diagnostic selectors show blog author links and single-post author/comment/profile/logout links. These now use the existing dark-blue accessible palette plus underlines; no global color override or verifier exception was added.
- Iteration 4 focused reruns for `TF-A11Y-001` and `TF-A11Y-007` are in progress.

## Repair iteration 4/5 accessibility proof

- Debian3 `/tmp/up-repair4-axe.json`: **RC 0** — `TF-A11Y-001` passes after narrowing the contrast repair to the exact blog/post/comment/profile text-link selectors.
- The apparent document scroll lock in `TF-A11Y-007` was traced to Bootstrap 5.3's `@media (prefers-reduced-motion:no-preference) { :root { scroll-behavior:smooth } }`. A real Debian2 fixture showed `scrollTo(0,1000)` progressing asynchronously from 0 to 974 over ~500 ms; the verifier correctly measured the focused control before that animation could make it visible.
- Live proof with only `scroll-behavior:auto` changed an offscreen control from ~1947px to ~359px immediately on focus (`scrollY=1588`). The theme now overrides Bootstrap at matching `:root` specificity and no longer needs the JavaScript `focusin` scroll workaround.
- Debian2 `/tmp/up-repair6-focus.json`: **RC 0** — `TF-A11Y-007` passes with all 24 measured focus targets and zero failures.
## Final source-preserving/runtime closure

- The remaining `TF-RUNTIME-006` / conversion failures were repaired without relaxing the verifier: source-fragment block markup is now materialized into block attributes at generation/import time, and page-source markup is stored/read from post meta before any source-file fallback. Rendered requests therefore do not depend on mutable source files.
- The final focus/scroll mismatch was repaired in the theme rather than the verifier. WordPress integration now disables the inherited global scroll-to-top helper, pins document scrolling to immediate/native behavior, and removes the hidden scroll helper from interaction.
- `dist/united-pets.zip` was regenerated from the exact current source on Debian1 with `theme-test.yaml` excluded as verification metadata. ZIP integrity passes. SHA-256: `f4b6d850221a810b6da9b8c1e20c6c29e3324e28ce93e0e7527f0463569fe396`.
- Exact-source Debian1 syntax gates: changed PHP files pass `php -l`; changed `assets/js/wordpress.js` passes `node --check`.
- Exact-source verifier regression suite: `26 passed` (`tests/test_theme_factory.py` + `tests/verification`).
- Exact-source release static verifier: PASS.
- Exact-source canonical release verification on pinned Podman/WordPress fixtures: `/tmp/up-canonical-final/final.json` = **PASS**, `expected=111`, `executed=111`, `passed=111`, `failed=0`, `notStarted=0`; runtime shards `s01` through `s06` and static receipt all pass. The aggregate tree is `6f7837c478b059f6895bd3aef38bf89f8d2224fe9d7549f7f6f3947c687ae16e`.
- Final repository gates on Debian1: `global-static` PASS (all 21 repo-scoped IDs) and `check-repo --require-complete` PASS with all 167 ledger rows complete and zero implementation holes.

## Remaining landing work

- Commit/push the final repair and regenerated package.
- Open the same-repository PR to `main`, observe the exact-head ARC verification (including the United Pets theme matrix), and require the provider `Full gate` check to succeed.
- Merge only through the repository fail-closed `theme-safe-merge` authority, then verify the landed `main` state.
