+
+{% endif %}
+```
+
+- [ ] **Step 6: Build and run the visual-parity checks on the home page**
+
+```bash
+zola build
+# Aktuelles heading via macro
+grep -c '
Aktuelles
' public/index.html
+# Expected: 1
+
+# Willkommen heading via macro
+grep -c 'Willkommen in unserer Praxis am Lienhardplatz' public/index.html
+# Expected: >= 1 (heading; carousel-caption has it too — exact count not asserted)
+
+# bordered-icon appears 4x (news, about, services, team)
+grep -c 'bordered-icon' public/index.html
+# Expected: 4
+
+# CSS class fix: gray-bg, not bg-gray
+grep -c 'class="x-services ptb-100 gray-bg"' public/index.html
+# Expected: 1
+grep -c 'bg-gray' public/index.html
+# Expected: 0
+
+# Service cards: thumbnail/caption structure, 3 rows × 2 cols
+grep -c 'class="thumbnail clearfix"' public/index.html
+# Expected: 6
+
+# Team preview: figure/figcaption + small
+grep -c '
+
+
+{% endblock %}
+```
+
+- [ ] **Step 2: Strip hardcoded values from content/contact.md**
+
+Overwrite `content/contact.md` with:
+
+```markdown
++++
+title = "Kontakt"
+template = "contact.html"
+weight = 60
++++
+
+**Die Praxis ist nach Termin organisiert.** Bei akuten Erkrankungen ist eine Vorstellung in der Praxis jederzeit möglich.
+
+## Ärztlicher Bereitschaftsdienst
+
+Sollten Sie außerhalb unserer Praxiszeiten ärztliche Hilfe benötigen, können Sie unter der für Sie kostenlosen Telefonnummer **116117** den [zentralen ärztlichen Bereitschaftsdienst](http://www.116117info.de) erreichen.
+
+Für lebensbedrohliche Notfälle gilt die **Notrufnummer 112**.
+```
+
+- [ ] **Step 3: Build and verify contact page renders with config values**
+
+```bash
+zola build
+grep -c 'Kaiserstraße 23' public/contact/index.html
+# Expected: >= 2 (one in page body, one in footer)
+grep -c '0202-730738' public/contact/index.html
+# Expected: >= 2 (page body + footer)
+grep -c 'Bereitschaftsdienst' public/contact/index.html
+# Expected: 1 (only in page body, footer doesn't mention it)
+grep -c 'single-page-title' public/contact/index.html
+# Expected: 1
+```
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add templates/contact.html content/contact.md
+git commit -m "feat: contact page template reads address/hours from config"
+```
+
+---
+
+## Task 14: Final visual diff and deploy gate
+
+**Files:** (no edits — verification only)
+
+- [ ] **Step 1: Full clean build**
+
+```bash
+rm -rf public processed_images
+zola build
+```
+Expected: succeeds, prints page count.
+
+- [ ] **Step 2: Cross-check rendered output for all five routes**
+
+```bash
+for route in index services/index team/index contact/index impressum/index; do
+ echo "=== $route ==="
+ echo "footer: $(grep -c footer-widget-section public/$route.html)"
+ echo "page_title: $(grep -c single-page-title public/$route.html)"
+ echo "section_title: $(grep -c 'class="section-title"' public/$route.html)"
+ echo "logo img: $(grep -c '/images/logo.png' public/$route.html)"
+done
+```
+Expected (minimum):
+- All five routes: `footer: 1`, `logo img: 1`
+- `services`, `team`, `contact`, `impressum`: `page_title: 1`
+- `services`: `section_title: 6` (6 sub-pages)
+- `team`: `section_title: >= 2` (doctors + employees sections, at minimum)
+- Home (`index`): `page_title: 0`, `section_title: 4` (news/about/services/team)
+
+- [ ] **Step 3: Local browser sweep**
+
+Run a local server:
+```bash
+zola serve --interface 0.0.0.0
+```
+
+Open in browser, walk through: `/`, `/services`, `/team`, `/contact`, `/impressum`. Confirm visually:
+- Logo appears in navbar (no text brand)
+- Home link active only on home page
+- Footer present on every page with sprechzeiten/kontakt/anschrift
+- Section-title pattern (centered h2 + circle icon) on all expected sections
+- Services as 2-column thumbnail/caption grid (not 3-column flat cards)
+- Team-preview with figure-style portraits and "Ihr Ärzteteam" heading
+
+If any check fails, fix in a small follow-up commit before deploy.
+
+- [ ] **Step 4: Stop the local server**
+
+`Ctrl-C` the `zola serve` process.
+
+- [ ] **Step 5: Ask user for deploy approval**
+
+Do not deploy without explicit user confirmation per the live-deploy memory ([[feedback-praxis-live-deploy]]). Phrase the ask: "Visual Parity Pass implementiert. Soll ich nach `~/public/praxis/` auf mycelium deployen?"
+
+- [ ] **Step 6: (After user OK) Deploy to staging**
+
+```bash
+rsync -avz --delete public/ mycelium:~/public/praxis/
+```
+
+- [ ] **Step 7: Verify staging is reachable**
+
+```bash
+curl -sI http://preview.praxis-am-lienhardplatz.de/ | head -1
+```
+Expected: `HTTP/1.1 200 OK`.
+
+- [ ] **Step 8: Update memory with completion note**
+
+Append a brief status line to `project_praxis_rebuild.md` noting Visual Parity Pass complete with date.
+
+- [ ] **Step 9: Push commits**
+
+```bash
+git push origin main
+```
+
+---
+
+## Notes for the implementer
+
+- **All commits in English** per the user's global CLAUDE.md.
+- **Never deploy without explicit OK** per [[feedback-praxis-live-deploy]] memory. Task 14 Step 5 is a hard gate.
+- **`{% import %}` must appear inside the block that uses it for Tera in this version** — that's why each template that uses a macro does its own `{% import %}` rather than relying on a global import.
+- **`page.url` vs `page.permalink`**: use whatever the existing navbar uses (it uses `permalink`); don't change without reason.
+- **If a `grep` count is off by one**: check whether the test counts the carousel caption or some other unrelated occurrence. The test commands are written to be specific (e.g., grep for `
Aktuelles
` not just `Aktuelles`), but adjust if context proves them ambiguous.
+- **Theme CSS is the contract.** If after Task 11 a section still looks wrong in the browser, grep `sass/_praxis_theme.scss` for the relevant class name and check whether the markup nests correctly. Do NOT modify the SCSS — adjust the markup.