theme-test.yaml parses
schema valid
architecture/workflow declared

Theme verification contract validates against schema


JSONL parses
unique IDs
known statuses
implementation exists when complete

Test ledger is well formed and IDs are unique


no irrelevant builder profile
feature gates respected
test IDs deduplicated

Planner selects only applicable profile/feature tests


every required applicable test reaches a workflow stage

Required test reachability is complete


pull_request gate exists
no required continue-on-error
aggregate depends on planned jobs
runtime needs admission

Workflow topology is fail closed


fork guard occurs before checkout/runtime

Self-hosted fork PR admission blocks untrusted checkout


no debian1/debian2/debian3 runs-on
approved scale-set labels only

ARC jobs use shared scale-set labels, never hostnames


no empty shard
stable shard IDs
indivisible groups preserved

Browser shard plan emits only nonempty unique shard IDs


all shard IDs present
cell sets disjoint
executed equals expected
notStarted zero for required

Receipt aggregate proves expected/executed union completeness


receipts if always
timings if always
heavy evidence failure-only

CI timing/receipt artifacts are always emitted


workflow concurrency key PR-scoped
cancel-in-progress true

Superseded PR runs cancel before expensive work


n o a c t i o n s / c a c h e i n A R C j o b s

No actions/cache is used on ARC self-hosted jobs


theme list generated from themes/
contract drift check available

Check manifest is generated rather than hand-curated


r e q u i r e d c o m p l e t e g u a r d s c a r r y r e d _ p r o o f e v i d e n c e

Required gate has synthetic RED proof metadata


Install pack audit round trip


Reject unsafe ZIP traversal path


Reject multi-root ZIP


Require style.css and index.php in ZIP


Reject case-fold duplicate ZIP paths


Reject symlink in ZIP


Generated ZIP cannot escape declared output directory


Pack rejects unexpected container files


Distribution ZIP is deterministic for identical tree


same relative file set
same sha256 per file

Dist ZIP tree equals canonical theme source tree


tracked dist artifact corresponds to theme tree

Dist ZIP is current when shippable source changes


1200x900 recommended or contract override

Theme screenshot exists and meets WordPress dimensions


no node_modules/.git/tests/tmp/cache/source maps unless allowed

No forbidden development artifacts in ZIP


archive budget
member budget
compression-ratio budget

Archive uncompressed/file-size/compression-ratio budgets enforced


install from ZIP succeeds
theme activates

Fresh WordPress installs exact dist ZIP


runtime receipt sha256 equals package receipt sha256

Fresh-install artifact digest equals planned artifact digest


Required WordPress theme files exist


Theme Name
Version
Requires at least
Requires PHP

style.css theme header is valid


All PHP files parse


All first-party JavaScript parses


All JSON files parse


version supported
settings/styles object types
valid JSON

theme.json validates basic WordPress schema contract


block.json required fields
unique names
editor/frontend handles exist

Custom block metadata is structurally valid


No filesystem symlinks in canonical theme tree


secret pattern scan clean
private key markers absent

No obvious committed secrets/private keys/tokens


no /home/user or /mnt/data or buildbox absolute path

No absolute workstation/buildbox paths in shipped code


no bundled sendmail/PHPMailer executable tree unless contract allowlist

No executable legacy mailer/runtime payload unless explicitly allowed


literal domains match when translation calls exist

Text domain and translation calls are coherent


no var_dump/die/dd debug calls outside allowlist

No debug-only fatal output or var dumps in shipped PHP


contract plugin dependencies have version/purpose/required flag

Declared dependency/plugin requirements are documented


source identity/digest or file inventory present

Source preservation manifest exists when conversion profile applies


baseline/reference authority declared
baseline files resolvable

Approved visual baseline manifest exists when visual authority requires it


state-changing admin handlers declare nonce/capability

Theme files pass WordPress escaping/nonce/capability static policy


Fresh WordPress boots after theme activation


all generated route cells executed
2xx/expected redirect

Declared public routes return successful responses


No uncaught page exceptions on declared routes


console.error empty after third-party allowlist

No theme-controlled console errors


no failed local JS/CSS/image/font/REST request

No failed theme-controlled network resources


visible img naturalWidth > 0
local CSS background URLs resolve

No broken rendered images


Every page has one logical H1 unless contract exception


header count
footer count
no duplicate shell

Declared global header/footer shell is present exactly once


menu links local routes resolve
current item unique
no empty required link

Dynamic navigation links resolve and current state is coherent


no Warning/Notice/Fatal error signatures in controlled responses

Runtime PHP/debug notices do not leak into HTML/JSON


fresh site uses pretty permalink structure before activation

activate exact candidate theme without manual rewrite flush

run demo import when declared without manual rewrite flush

declared page/post/CPT archive and singular pretty-permalink routes resolve immediately

WordPress rewrite_rules option contains declared custom rewrite bases when applicable

theme does not call flush_rewrite_rules on normal frontend/admin requests

Fresh activation/import flushes rewrite rules so pretty permalinks work immediately


zero serious/critical WCAG2AA violations

Axe WCAG 2.2 AA baseline passes


skip link focusable
target receives/follows focus

Skip link is keyboard reachable and moves focus to content


Enter/Space/Arrow opens when applicable
Escape closes and restores focus

Desktop navigation dropdown is operable by keyboard


toggle focusable
open/close state semantic
no focusable hidden submenu after close

Mobile navigation is operable and dismissible by keyboard


Visible form controls have accessible names/labels


touch controls meet policy or spacing exception

Interactive controls meet declared minimum target geometry


outline/focus style detectable for sampled controls

Focus indicators are not permanently clipped/obscured


Tab sequence progresses or declared focus trap can dismiss

No keyboard trap in modal/menu/forms


No unintended document horizontal overflow


Required interactive elements remain inside reachable viewport


No independent controls overlap ambiguously


No unrelated text/media destructive overlap


No invisible element intercepts pointer input


No stale overlay/backdrop blocks page


No scroll lock exists without active owner


No pathological character-level word fragmentation


Required labels/identifiers are not unrecoverably truncated


No unintended nested/double vertical scroll trap


Hidden responsive variants do not retain active focus targets


Overflow clipping does not cut focus/dropdown/validation UI


Fixed/sticky layers do not cover required content/admin bar


Modal dismissal/focus restoration contract holds


Repeated components obey declared spacing/alignment tolerance


Declared equal-height card groups satisfy geometry tolerance


Missing/empty dynamic regions do not leave destructive reserved space


Responsive breakpoints have no both/neither visibility gap


Images preserve declared aspect/crop containment


Disabled controls stay semantically and behaviorally disabled


No accidental duplicate IDs/forms/interactive components


Absolute/high-z layers do not escape owner or intercept unrelated UI


Required functionality is not hover-only


Gutenberg wide/full/nested content does not break viewport


Mobile input/table/menu behavior does not expand or trap viewport


no Error loading block
no invalid JSON response
no block recovery
no page/console errors
theme REST JSON valid

Every imported Gutenberg page opens with valid block/REST responses


edit sentinel
save
frontend changes
restore

Representative Gutenberg content edit-save-frontend-restore round trip


required editableFields subset exposed fields

Declared editable-field coverage is exposed by custom/source blocks


WP global settings endpoint/styles reflect theme.json

theme.json is loaded by WordPress


inserter available unless hidden by contract

Custom blocks register successfully and are insertable


Patterns required by contract are registered


declared semantic roots/content present editor and frontend

Editor/frontend structural parity holds for declared components


each custom block declares justification/capability unavailable in core

Core blocks are preferred where contract does not justify custom block


save
reload editor
no invalid content/recovery

Block save serialization remains valid after reload


get_page_templates contains contract templates

Required page templates are registered by WordPress


not default when dedicated template required

Imported pages use declared dedicated templates


expected blocks/pattern offered or inserted

Selecting dedicated template provides expected editable block composition


header/footer/content root present exactly as contract

Dedicated template frontend shell matches declared global shell


notice appears after activation
CTA visible
target Appearance submenu

Activation notice offers demo import CTA under Appearance


Appearance submenu exists
top-level Import menu absent

Demo importer is not exposed as top-level admin menu


unauthorized request rejected
missing/bad nonce rejected

Demo importer requires capability and nonce


s t a t e s n a p s h o t A e q u a l s B f o r p a g e s / p o s t s / m e d i a / m e n u s / t e r m s / C P T / s e t t i n g s

Demo import is idempotent across second run


all contract demo entities exist
front/posts page settings match

Demo import creates declared pages/content/menu/settings


valid submission reaches expected terminal state

Declared forms submit through WordPress-controlled endpoint


required invalid blocks submission
error associated with control
state recovers

Form invalid/required states are accessible and recoverable


rapid second activation does not duplicate side effect

Duplicate submit does not create duplicate operation


privileged endpoints return auth/capability failure

Anonymous user cannot invoke privileged theme admin actions


JSON content-type where declared
no HTML/PHP warning prefix

Theme REST/AJAX responses stay valid structured data without PHP leakage


declared root/component counts within contract

Reference and WordPress major structural roots correspond


bounding box delta within tolerance for anchors

Reference and WordPress geometry stays within declared tolerances


approved deviations masked only by manifest

Reference and WordPress screenshots stay within approved threshold


menu/carousel/modal/form declared behaviors equivalent

Interactive behavior parity holds for declared source behaviors


each deviation has selector/reason/type
no wildcard whole-page waiver

Allowed source-preservation deviations are explicit and bounded


baseline changed => approval evidence required

Approved visual baseline cannot self-update silently


Mockup-to-theme structural anchors match approved mockup contract


screenshot diff under approved threshold

Mockup-to-theme screenshot comparison passes approved tolerance


transfer/resource sizes under contract budget

First-party JS/CSS byte budgets are respected


Request-count budget is respected


DOM node budget is respected


rendered images have intrinsic dimensions

Images declare dimensions/aspect containment to prevent avoidable shift


font requests/weights under contract budget

Font family/weight request budget is respected


measurement receipt includes LCP/CLS/INP where available

CWV/Lighthouse measurement is recorded without becoming flaky hard gate


nonempty title
single canonical when contract requires
description policy

Document title/meta/canonical basics exist


JSON-LD parses
declared type fields present
URL/title consistent

Structured data is valid JSON and does not contradict visible identity


visible hierarchy current page correct
JSON-LD matches visible

Breadcrumb contract and structured data agree when breadcrumbs declared


templates/*.html present
block comments balanced
parts resolvable

Block theme templates and template parts parse as valid block markup


site editor loads
no page/console errors

Site Editor boots without errors


Required FSE templates are registered


declared parts registered
frontend includes them

Template parts are registered and render


edit template part
save
frontend sentinel
restore

Site Editor change round-trips to frontend and restores


variation registered
no invalid theme.json data

Style variations declared by contract load without invalid settings


declared template files exist
fallback index.php exists

Classic PHP template hierarchy covers declared routes


menu locations registered
assigned menu renders

Declared menus are registered and render


sidebar registered
widget visible after assignment

Declared sidebars/widgets are registered and render


Customizer boots and declared controls persist


Classic editor content renders without theme-owned markup loss


Elementor activates at pinned version
theme activates

Pinned Elementor fixture installs and theme remains activatable


editor canvas loads
no page/console errors
no failed local REST

Elementor editor boots without fatal/network/editor errors


global colors/fonts/container widths declared

Declared global Elementor kit/tokens exist


header/footer/singular/archive templates exist where declared

Theme Builder templates/conditions cover declared surfaces


edit sentinel
save
frontend changes
restore

Elementor content edit-save-frontend-restore round trip works


t i t l e / i m a g e / m e t a t a g s r e s o l v e s e e d e d e n t i t y

Declared dynamic tags resolve real WordPress data


no deprecated section/column structure when prohibited

Elementor uses container architecture required by contract


optional dependency degrades as declared

Elementor dependency/lock-in and fallback behavior matches contract


WooCommerce activates
theme support contract

Pinned WooCommerce fixture installs and theme declares support


Shop archive renders declared product grid


t i t l e / p r i c e / a d d - t o - c a r t v i s i b l e a n d o p e r a b l e

Product single renders required commerce controls


single activation increments expected quantity once

Add-to-cart updates cart state exactly once


cart row/action usable
no overflow at mobile

Cart page remains operable/responsive


required validation works without payment

Checkout renders required fields and validation


login/account routes usable
labels/keyboard

My Account/login surface renders accessibly


no known obsolete override vs fixture metadata

WooCommerce template overrides are compatible with pinned version


Theme activates on declared minimum WordPress/PHP fixture


Theme activates on pinned current WordPress/PHP fixture


missing dependency notice/fallback matches contract

Declared optional plugin absence degrades gracefully


unsupported required plugin version yields explicit controlled state

Declared required plugin version boundaries fail clearly


identity fields populated
40-char tree
check definition digest
artifact sha256

CI receipt binds exact tree, contract, checks, environment and artifact digest


a g g r e g a t e c o n s u m e s j o b a r t i f a c t s / r a w r e s u l t s , n o t r e p o s i t o r y r e c e i p t a s a u t h o r i t y

Checked-in agent receipt cannot satisfy authoritative gate


o n e f a i l e d r e q u i r e d r e c e i p t = > n o n z e r o a g g r e g a t e

Required test failure blocks aggregate/release


m i s s i n g e x p e c t e d c e l l = > n o n z e r o a g g r e g a t e

Missing shard/test receipt blocks aggregate/release


d e c l a r e d e x p e c t e d e r r o r m u s t o c c u r e x a c t l y a s c o n t r a c t e d ; s t a l e d e c l a r a t i o n f a i l s

Unexpected/stale expected-error declaration fails