Load this file to verify a theme implementation (full build or a named phase).
Do not use this file to implement.
New to the repo? Read start-stackable.md first, then implement via start-stackable.plan.md.
Law: start-stackable.agents.md.
Work the lists that match the claimed phase. For a finished theme, work every list. Each item is pass or fail. Fail is a concrete file, slug, class, or screenshot note, not a vibe. Do not add e2e in this pass unless the user asked; this check is the guardrail before e2e.
- Read law + the phase(s) claimed complete.
- Inspect the filesystem (tree,
theme.json, templates, parts, patterns,functions.php,readme.txt,style.css). - Grep for forbidden strings (
stackable/,"ref":,function.php,front-page.html, undefined presets). - If a WordPress install is available, activate with Stackable off and walk Default.
- Report: phase, pass count, fail list (path + what is wrong), leftover plan items.
Stop if law and the tree disagree; law wins.
-
functions.phpexists;function.phpdoes not. - No
templates/front-page.html. - No
stackable/intemplates/,parts/,patterns/. - No Navigation
refin committed HTML/PHP patterns. - No
var:preset|spacing|50(or60/70/80) and no color slugssecondary/mainunless they exist intheme.json. - Every template/part/pattern preset slug exists in
theme.jsonor a style variation that overrides the same slug. - Footer copyright is the user's site, not "Start Stackable Theme".
- No kit importer, no kit wizard, no remote demo fetch, no import on
after_setup_theme/after_switch_theme. - No custom blocks, shortcodes, or CPTs.
- Functions prefixed
start_stackable_; text domainstart-stackable. - Zip (or
npm run buildoutput) excludes docs, e2e,.cursor,node_modules,src/,webpack.config.js.
- Theme activates without a PHP fatal.
-
style.csshasTheme Name,Text Domain: start-stackable,Requires at least. -
npm run start/npm run compileemitassets/build/frontend.jsandfrontend.css. -
functions.phpenqueues that bundle when the.asset.phpfile exists.
- Palette slugs match the token contract (
primary…outline-contrast). -
layout.contentSizeis645px;wideSizeis1340px. - Font sizes have fluid min/max (or equivalent fluid config).
- Spacing uses
clampor otherwise does not look like desktop scale on a 375px width. - Shadow presets exist.
- Border radius sizes exist.
- Plus Jakarta Sans is registered via
fontFaceand files live underassets/fonts/. - Headings, site title, and post title use slug
plus-jakarta-sans. - Body (
styles.typography.fontFamily) uses the system UI stack (slugsans-serif). -
styles.elementscovers heading, link, button (including outline). -
styles.blockscovers button, navigation, site-title, quote, search, query-pagination, post-title at minimum. -
customTemplatesincludesfull-widthandblank. -
templatePartsincludesheader,header-transparent,header-minimal,footer,footer-landing.
-
styles/colors/files override the same palette slugs. -
styles/typography/has at least two type presets. - At least one dark variation exists and keeps the same slugs.
- Switching a variation in Styles would change header, footer, and blog cards (no hardcoded hex in templates/parts).
-
parts/header.html(and transparent/minimal) are pattern includes or equivalent core-only markup. -
parts/footer.htmlandfooter-landingexist. - Header contains Site Title or Logo and Navigation without
ref. - Front-end copyright is not the theme author brand.
-
templates/index.htmlis a designed post grid (header + cards + footer), not a bare Query Loop. -
templates/home.htmluses the same grid (posts index when a static front is set). -
templates/archive.html,search.html,404.html,single.htmlexist and are designed. - Single includes title, featured image, meta, comments form.
- Post cards share an image aspect or height.
- On a latest-posts site,
/would show header + grid + footer without creating a page.
-
pagetemplate shows a theme post title. -
full-widthhas no Post Title block and no extramainpadding that blocksalignfull. -
blankhas no header or footer template parts.
- Sticky works without a Stackable container.
- Transparent header overlays a full-bleed first section on
full-width. - After scroll, header background is opaque and text stays readable.
-
--stk-header-heightis set to a non-zero px value on the front. - Contract classes
stk-shell-header-stickyandstk-shell-header-transparentare the names the theme honors. - Mobile nav overlay sits above a full-bleed first section.
- Inventory in the plan exists: template patterns, part patterns,
post-card,post-meta,comments. - Exactly one marketing starter:
page-home(or equivalent slug) withcore/post-content. - No standalone theme patterns whose job is hero, pricing, testimonial, team, FAQ, or logo grid.
- Pattern strings are i18n-escaped.
- Shop, product, cart, checkout templates exist and use Woo/core blocks + theme tokens.
- Theme still activates with Woo inactive.
-
bodygetsstk--is-stackable-themewhen this theme is active. - Admin notice recommends
stackable-ultimate-gutenberg-blocksonly when the plugin is inactive; dismissible; user-initiated install. - Notice is absent when Stackable is active.
- Breakpoint filter runs only if the plugin is present.
- Switching the theme does not create kit pages.
-
screenshot.pngexists and depicts Default, not a Site Kit. -
readme.txtstates the plugin is optional and starter sites are not in the zip. - Font and image licenses are listed.
-
style.csstags that are advertised are true (block-patterns,style-variations,e-commerceonly if Woo templates shipped).
- Theme does not import kit JSON.
- Plugin can assign
full-width+ header flags without a theme PHP change (classes/meta documented in the contract). - User Global Styles / variation overlay can restyle the same token slugs.
All phase lists pass.
First-activation look is designed-blog craft, not a marketing landing in home.html.
Shell contract table in start-stackable.agents.md still matches the tree.