Technical SEO Implement
Implements fixes from a technical-seo-audit run. Do not re-run the full 69-rule audit from scratch.
Required input
Resolve the audit folder the same way as technical-seo-audit (discover website packages; do not assume sites/):
- Single-site:
reports/seo/YYYY-MM-DD-HHmm/
- Multi-site:
<site-dir>/reports/seo/YYYY-MM-DD-HHmm/ (infer <site-dir> from the user, cwd, or changed paths)
Prefer:
{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/handoff.md
Also useful:
{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/index.html (context)
{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/meta.json (counts / commit)
If the user names a folder, use that. Honor older audit/, seo/*/technical-seo-scorecard.md, or the other layout if that is where the run actually lives.
If missing, ask for the audit folder path. If they need a new audit first → technical-seo-audit.
Workflow
- Read
handoff.md fully.
- Implement High then Medium
IMP-* tasks. Skip Low unless the user asks.
- For each task: satisfy Acceptance, match project patterns, keep diffs focused.
- Preserve intentional
noindex and notes from the audit.
- Walk Common implementation pitfalls against the diff. Fix anything that applies before calling the work done.
- When done, write a short summary (and optionally
{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/implementation-summary.md):
# SEO implementation summary
| IMP-ID | Rule | Status | Files |
|--------|------|--------|-------|
| IMP-001 | T-02 | done | … |
## Blocked
- …
## Next
Re-run technical-seo-audit (new dated folder) with fresh SF/PSI attachments if available.
Rules
- Do not invent scope beyond
handoff.md unless the user expands it.
- Ignore SF security-header noise unless an IMP task includes it.
- Prefer shared layouts/partials over one-off page edits.
- No drive-by refactors.
Common implementation pitfalls
Check these after the IMP tasks. They are how SEO/a11y diffs look finished in HTML but fail review. Skip items that do not exist on this stack.
CMS vs template
- An editor hint is not an alt field. If the claim is “images have real alt text,” the CMS schema must expose
alt (or equivalent) and the template must pass it through. Empty alt="" is correct only for decorative images inside a named link.
- Do not claim a CMS-driven fix is done if the field cannot be filled or the layout ignores it.
i18n
- Localize every chrome surface you touch (desktop nav, mobile nav, lightbox fallbacks,
aria-labels). One locale string next to an untranslated sibling is a miss.
- Do not call the site’s i18n helper unless that catalog actually exists. Match the project’s existing locale pattern, or fallbacks always ship the default language.
Crawlers vs users
- A real
href on legal/footer links is not enough if JS still preventDefault()s on modal/dialog attributes. Crawlers see the URL; JS users must either navigate or the PR must say the modal is intentional.
- If you special-case some links (modals, absolute URLs,
mailto:), keep the same URL helper (relURL / absURL / site-root prefix) on the default branch. Bare relative paths resolve wrong on nested routes.
Error pages
- Static hosts often have two 404s: the generator’s
layouts/404 (site root) and a self-contained /errors/404.html for the CDN. Changing robots or branding on one leaves the other wrong. Prefer noindex, follow on both.
One source of truth
- Compute title and description once in the base layout; pass them into JSON-LD and OG/Twitter. Duplicated
| default expressions drift.
- Prefer a data attribute on the menu entry (
modal: privacy) over string-matching "#privacy". New links will miss hardcoded branches.
Config leftovers
- If you change URL mode (
relativeURLs, baseURL, trailing-slash), delete comments and client <base href> workarounds that describe the old mode.
- Do not add slash-trim/re-add on
baseURL when the generator already guarantees the trailing slash.
A11y chrome
role="dialog" / aria-modal="true" requires moving focus in, trapping Tab, and restoring focus on close. Otherwise do not claim it is a dialog.
CI / checks
- If the link checker rebuilds the site (e.g.
--baseURL /), it must not overwrite the production public/ (or equivalent) that later pa11y / HTML-validate steps read. Use a separate output directory.
- Do not serialize a check job on the production build artifact if that job runs its own independent build.
- Do not commit bulky audit HTML (
reports/seo/). Gitignore it. The PR description must match the diff.
1---2name: technical-seo-implement3description: Implements technical SEO fixes from a technical-seo-audit handoff.md (IMP-* tasks) produced under reports/seo/YYYY-MM-DD-HHmm/ (single-site) or <site-dir>/reports/seo/YYYY-MM-DD-HHmm/ (multi-site). Use when the user asks to apply SEO audit recommendations, implement scorecard fixes, or follow up after a technical-seo-audit HTML report.4---56# Technical SEO Implement78Implements fixes from a **technical-seo-audit** run. Do not re-run the full 69-rule audit from scratch.910## Required input1112Resolve the audit folder the same way as `technical-seo-audit` (discover website packages; do not assume `sites/`):1314- **Single-site:** `reports/seo/YYYY-MM-DD-HHmm/`15- **Multi-site:** `<site-dir>/reports/seo/YYYY-MM-DD-HHmm/` (infer `<site-dir>` from the user, cwd, or changed paths)1617Prefer:1819```text20{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/handoff.md21```2223Also useful:2425- `{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/index.html` (context)26- `{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/meta.json` (counts / commit)2728If the user names a folder, use that. Honor older `audit/`, `seo/*/technical-seo-scorecard.md`, or the other layout if that is where the run actually lives.2930If missing, ask for the audit folder path. If they need a new audit first → `technical-seo-audit`.3132## Workflow33341. Read `handoff.md` fully.352. Implement **High** then **Medium** `IMP-*` tasks. Skip **Low** unless the user asks.363. For each task: satisfy **Acceptance**, match project patterns, keep diffs focused.374. Preserve intentional `noindex` and notes from the audit.385. Walk **Common implementation pitfalls** against the diff. Fix anything that applies before calling the work done.396. When done, write a short summary (and optionally `{{REPORT_ROOT}}/YYYY-MM-DD-HHmm/implementation-summary.md`):4041```markdown42# SEO implementation summary4344| IMP-ID | Rule | Status | Files |45|--------|------|--------|-------|46| IMP-001 | T-02 | done | … |4748## Blocked49- …5051## Next52Re-run technical-seo-audit (new dated folder) with fresh SF/PSI attachments if available.53```5455## Rules5657- Do not invent scope beyond `handoff.md` unless the user expands it.58- Ignore SF security-header noise unless an IMP task includes it.59- Prefer shared layouts/partials over one-off page edits.60- No drive-by refactors.6162## Common implementation pitfalls6364Check these after the IMP tasks. They are how SEO/a11y diffs look finished in HTML but fail review. Skip items that do not exist on this stack.6566**CMS vs template**6768- An editor hint is not an alt field. If the claim is “images have real alt text,” the CMS schema must expose `alt` (or equivalent) and the template must pass it through. Empty `alt=""` is correct only for decorative images inside a named link.69- Do not claim a CMS-driven fix is done if the field cannot be filled or the layout ignores it.7071**i18n**7273- Localize every chrome surface you touch (desktop nav, mobile nav, lightbox fallbacks, `aria-label`s). One locale string next to an untranslated sibling is a miss.74- Do not call the site’s i18n helper unless that catalog actually exists. Match the project’s existing locale pattern, or fallbacks always ship the default language.7576**Crawlers vs users**7778- A real `href` on legal/footer links is not enough if JS still `preventDefault()`s on modal/dialog attributes. Crawlers see the URL; JS users must either navigate or the PR must say the modal is intentional.79- If you special-case some links (modals, absolute URLs, `mailto:`), keep the same URL helper (`relURL` / `absURL` / site-root prefix) on the **default** branch. Bare relative paths resolve wrong on nested routes.8081**Error pages**8283- Static hosts often have two 404s: the generator’s `layouts/404` (site root) and a self-contained `/errors/404.html` for the CDN. Changing robots or branding on one leaves the other wrong. Prefer `noindex, follow` on both.8485**One source of truth**8687- Compute title and description once in the base layout; pass them into JSON-LD and OG/Twitter. Duplicated `| default` expressions drift.88- Prefer a data attribute on the menu entry (`modal: privacy`) over string-matching `"#privacy"`. New links will miss hardcoded branches.8990**Config leftovers**9192- If you change URL mode (`relativeURLs`, `baseURL`, trailing-slash), delete comments and client `<base href>` workarounds that describe the old mode.93- Do not add slash-trim/re-add on `baseURL` when the generator already guarantees the trailing slash.9495**A11y chrome**9697- `role="dialog"` / `aria-modal="true"` requires moving focus in, trapping Tab, and restoring focus on close. Otherwise do not claim it is a dialog.9899**CI / checks**100101- If the link checker rebuilds the site (e.g. `--baseURL /`), it must not overwrite the production `public/` (or equivalent) that later pa11y / HTML-validate steps read. Use a separate output directory.102- Do not serialize a check job on the production build artifact if that job runs its own independent build.103- Do not commit bulky audit HTML (`reports/seo/`). Gitignore it. The PR description must match the diff.