Known Issues¶
Current as of 2026-05-07. Fixed issues get deleted, not archived — git log is history.
trimtech.ie specific¶
Insurance Industry Compliance — fabricated, not on live¶
Confirmed via Gemini placement check on 2026-04-12: the section does not exist on live. The "TrimTech Hire Fleet" item belongs in the homepage Service Grid, not as its own section. Either the matcher is mis-grouping a service-grid card into a standalone About-style section or the structure-matcher is picking up a hidden Wix container as a section. Needs investigation in assembler-v3.js buildSections() and the About vs ServiceGrid matchers.
Header nav single-row vs live's two-row split (subpages)¶
Live trimtech wraps the main nav onto two rows below the topbar. Our Header.astro renders a single horizontal row right of the logo. Affects every subpage. Header matcher / component change.
Hero text overlay leaks onto subpages¶
Subpages (e.g. about-us) render a Hero component with the slideshow text overlay. Live subpages have a clean image-only hero. Probably a Hero matcher false-positive on subpage hero strips, OR the matcher should detect "no slideshow nav present" and emit a no-overlay variant.
About column-image vertical alignment¶
Multiple About-style sections render with the image column starting visually below the text column instead of flush-top. Looks like a flex/align-items issue in About.astro .about__media. Affects every site, not just trimtech.
Service icons missing on subpage service item lists¶
Live subpages show a small icon next to each service description (Vehicle Body Repairs, Precision Paintwork, etc.). Our About matcher extracts the text but drops the icon. Matcher needs an icon-extraction step that walks for the closest preceding <svg> or <img> per item.
Pro Gallery capture misses last item (ServiceGrid card count)¶
capture-layout.js scroll-loads the Wix Pro Gallery and reads data-hook="item-title" nodes. On trimtech, live has 8 service cards but we capture only 7 ("Tyre & Alloy Wheel Specialists" missing). Either the scroll doesn't go far enough or Wix is lazy-mounting beyond our wait loop. Fix: increase scroll distance / add a second wait pass for items that mount late. See lib/capture-layout.js Pro Gallery block.
Hero picks wrong slideshow slide heading¶
Wix slideshow has multiple <h1> elements (one per slide), all present in the DOM at all times. Hero.js picks the first, which may not be the visually active slide. Live shows "RELAX, WE'LL TAKE IT FROM HERE." but we pick "TrimTech Crash Repair & Bodyshop". Fix options: (a) enumerate all slide headings in capture-layout.js and pass them through as slideshowHeadings[] to cycle alongside images; (b) read which slide is active via the aria-hidden / display state in the captured DOM.
Core Services image sizing¶
User reports 3 visual images where we pass only 2. Likely causes: (a) the outer section's alt="background" image is bleeding through via section CSS; (b) About.astro .about__media flex column max-heights render at different proportions than live. Needs inspection in browser devtools on the deploy.
Pinned-layer children escape coverage¶
comp-mnpz99kc and comp-mn66d9ou remain uncovered on trimtech.ie homepage — they're children of a pinned layer that the matcher walker doesn't visit. Coverage reports them as misses. Fix: extend section enumeration to walk pinned layer subtrees, or register a dedicated matcher for these pinned decorative comps.
Insurance Industry Compliance — on live?¶
Gemini placement check says the section is absent from live homepage. Either Gemini screenshots didn't reach that scroll depth or live really moved the section. Verify manually before "fixing" — may be a screenshot-range issue, not an extraction bug.
TopBar drops Mail/Phone/Location icons + "Dublin" location text¶
Live trimtech topbar has 6 icons on the right (Mail, Phone, Location, Instagram, Facebook, TikTok) and "Dublin" text on the left next to the email. Ours emits only Instagram/Facebook/TikTok and no location text. TopBar matcher needs to extract icon-only links (no platform regex match) AND short text labels next to the contact info.
Pipeline-wide¶
Phase 1 fails on nested-slug pages (CSS mkdir)¶
lib/dom-pipeline.js:723-724 writes per-page CSS as path.join(cssDir, slug + '-N.css'). When the slug contains a slash (e.g. post/foo, local-service/electrician-dublin-3), the subdirectory under public/assets/css/ is never mkdirSync'd and the page fails with ENOENT. Same pattern probably applies to other per-slug writes in the same block. Fix: fs.mkdirSync(path.dirname(path.join(cssDir, cssFile)), { recursive: true }) before the write.
Phase 1 and Phase 2/3 write to different build dirs¶
lib/dom-pipeline.js (Phase 1) writes under ~/replatform-dashboard/builds/<domain>/ but lib/capture-layout.js, lib/theme-extractor.js, and lib/assembler-v3.js all read/write under ~/replatform/builds/<domain>/. Currently worked around by cp -r between the two trees. Fix: pick one canonical BUILD_DIR and have every phase use it.
Phase 4+ requires manual assembled-site scaffold¶
lib/assembler-v3.js outputs into builds/<domain>/assembled/, but there is no scaffolder that creates assembled-site/ with package.json, astro.config.mjs, src/pages/, and real (not symlinked) src/components/. First run for a new site is currently hand-scaffolded from a template like trimtech. Also note: cp -r /home/admin/replatform/components/src/components dest creates a symlink because the source path ends in a symlink — must use cp -r SRC/. DEST/ to get real files. Symlinked components cause vite to walk up to /home/admin/replatform-dashboard/tsconfig.json which extends an uninstalled astro/tsconfigs/strict and breaks the build.
Slideshow image download is manual¶
Phase 1 downloader only fetches images that appear in the static body.html. Slideshow slides 2+ that only exist in JS state are captured by capture-layout.js but not auto-downloaded. Currently worked around by curl-ing them per site. Fix: have capture-layout.js download the full-resolution image for each enumerated slide.
Component sync is manual¶
Components live in components/src/components/ (canonical) but Astro builds from builds/<domain>/assembled-site/src/components/. If a source component is edited and not copied across, the deploy silently uses the old version. Runbook includes the copy step but it's easy to forget.
Fix: add a sync step to the deploy runbook that always refreshes components before astro build.
Assembled pages → src/pages is manual¶
assembler-v3.js writes to builds/<domain>/assembled/<slug>.astro. Astro builds from builds/<domain>/assembled-site/src/pages/<slug>.astro. There is no automated sync step — runbook has cp builds/<domain>/assembled/*.astro builds/<domain>/assembled-site/src/pages/ as a manual step.
Fix: have assembler-v3.js write directly into assembled-site/src/pages/, deleting the intermediate assembled/ directory.
Phase 5 >25 MiB file drop is silent¶
Cloudflare Pages rejects files >25 MiB. Runbook does find dist -type f -size +24M -delete before deploy, which silently removes the file. If it was a hero video, the hero breaks with no warning. trimtech's Sherwin-Williams video was 30MB and had to be manually compressed with ffmpeg scale=1280 crf 28 → 9MB.
Fix: in the assembler, detect oversize videos and emit an ffmpeg command (or run it automatically) before copying into public/assets/videos/. Also log when Phase 5 drops anything.
Placement check captures up to 8000px only¶
lib/placement-check.js scrolls in 900px steps until scrollHeight or 8000px, whichever is smaller. Long pages get truncated and Gemini can report "section not present on live" when it's just below the capture window. Raise the cap or paginate the comparison.
Top-level section enumeration vs nested¶
assembler-v3.js enumerates all section elements (not just top-level) and runs the matcher on every candidate, then dedupes ancestor/descendants with matching matchers. Works, but the ordering in the rendered page can become non-obvious when nested sections get matched as siblings of their ancestors. If a future matcher introduces weird ordering, revisit buildSections() and sigToEntries dedupe.
No Phase 2/3 fallback when computedLayout is missing¶
If capture-layout.js fails or is skipped, the About matcher's layout-based image-position detection falls back to imagePosition='left' for everything. Technical Capabilities and other text-left/image-right sections will render mirrored. Accept as degradation, but make the fallback explicit in the report.
Older v2 debt (mostly superseded by v3)¶
v3 replaces most of the v2 hot path. These remain relevant only if we need to fall back to v2 for unmatched sections:
- Phase 2 classification missed Testimonials on medical homepage — real reviews block got classified as About. v3's matcher approach avoids this via explicit Testimonials matcher with review-text signals.
- Claude JSX escape / missing imports — only matters if Claude is invoked as fallback. Deterministic assembler-v3 doesn't have this class of bug.
Interactions gap¶
Phase 1 DOM clone ships interactions.js for dropdowns, slideshow/video sync, FAQ accordion, scroll reveal, lightbox. v3 components are mostly self-contained (Header, Gallery, Testimonials have own <script> blocks; FAQ uses native <details>; Hero supports backgroundVideo + slideshow nav + reveal animation).
Real remaining gaps: - Section-level scroll-reveal — only Hero has a reveal animation; About/ServiceGrid don't fade in on scroll. - Video ↔ slideshow sync — hiding background video when a slideshow advances past slide 0. Niche.
A small shared IntersectionObserver helper would cover scroll-reveal without the Wix dependency.