V3 launch and archive implementation plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Promote www/v3/ to live at getorcha.com/de/ and getorcha.com/en/, archive the current site to getorcha.com/archive/, wire community pages + 404s with v3 chrome.

Architecture: Pure static-site migration. File moves only (no code rewrites except chrome.js path fixes and per-page header/footer rewires). Single branch, 7 atomic commits. Manual browser smoke test before pushing.

Tech Stack: Static HTML + CSS + JS. No build step. Deploys via AWS CodePipeline (user triggers manually).

Spec: docs/superpowers/specs/2026-05-16-v3-launch-and-archive-design.md


Branch setup

cd /Users/maximilianbrandstaetter/Orcha
git checkout master
git pull origin master
git checkout -b v3-launch

Expected: Switched to a new branch 'v3-launch'


Task 1: Archive the current site

Files:

Run: ls www/de/ www/en/

Expected output should include: index.html about contact community imprint privacy produkt terms validation-preview.html 404.html (DE) and the EN equivalent (note EN has product/ not produkt/, imprint/ privacy/ terms/ instead of impressum/ datenschutz/ agb/, and no validation-preview.html).

mkdir -p www/archive/de www/archive/en
cd /Users/maximilianbrandstaetter/Orcha
git mv www/de/index.html www/archive/de/index.html
git mv www/de/about www/archive/de/about
git mv www/de/contact www/archive/de/contact
git mv www/de/imprint www/archive/de/imprint
git mv www/de/privacy www/archive/de/privacy
git mv www/de/produkt www/archive/de/produkt
git mv www/de/terms www/archive/de/terms
git mv www/de/validation-preview.html www/archive/de/validation-preview.html
git mv www/en/index.html www/archive/en/index.html
git mv www/en/about www/archive/en/about
git mv www/en/contact www/archive/en/contact
git mv www/en/imprint www/archive/en/imprint
git mv www/en/privacy www/archive/en/privacy
git mv www/en/product www/archive/en/product
git mv www/en/terms www/archive/en/terms
ls www/de/
ls www/en/

Expected: each shows only community 404.html (no other files/folders).

ls www/archive/de/ && echo "---" && ls www/archive/en/

Expected DE: about contact imprint index.html privacy produkt terms validation-preview.html Expected EN: about contact imprint index.html privacy product terms

git commit -m "$(cat <<'EOF'
chore(www): move current site to /archive/

Frozen snapshot of the old site, kept reachable at /archive/{de,en}/
for reference. /de/community/ and /de/404.html stay at the live root.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 2: Delete v3 drafts and exploration files

Files (all delete):

ls www/v3/de/agents-draft.html www/v3/de/korrektheit-draft.html www/v3/design-guide.html www/v3/robots.txt
ls -d www/v3/de/archive www/v3/en/archive www/v3/variations www/v3/dev

Expected: all 8 paths listed, no errors.

git rm www/v3/de/agents-draft.html
git rm www/v3/de/korrektheit-draft.html
git rm www/v3/design-guide.html
git rm www/v3/robots.txt
git rm -r www/v3/de/archive
git rm -r www/v3/en/archive
git rm -r www/v3/variations
git rm -r www/v3/dev
ls www/v3/de/agents-draft.html 2>&1
ls -d www/v3/variations 2>&1

Expected: both report "No such file or directory".

find www/v3 -maxdepth 2 -type d
find www/v3 -maxdepth 1 -type f

Expected directories: www/v3, www/v3/css, www/v3/de, www/v3/en, www/v3/js, plus subdirs of de/ and en/ (produkt, agenten, steuerberater, etc.) Expected files at v3 root: none (design-guide.html and robots.txt were removed).

git commit -m "$(cat <<'EOF'
chore(www): delete v3 drafts and internal-only exploration files

Removes agents-draft.html, korrektheit-draft.html, the variations/
mockup gallery, dev/ Playwright tooling, design-guide.html, and the
v3-internal archive/ subfolders. Root www/robots.txt is authoritative,
so v3/robots.txt is removed too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 3: Promote v3 CSS and JS to root

Files:

comm -12 <(ls www/css/ | sort) <(ls www/v3/css/ | sort)
comm -12 <(ls www/js/ | sort) <(ls www/v3/js/ | sort)

Expected: both commands produce no output (no overlapping names).

cd /Users/maximilianbrandstaetter/Orcha
git mv www/v3/css/v3.css www/css/v3.css
git mv www/v3/css/product.css www/css/product.css
git mv www/v3/css/responsive.css www/css/responsive.css
git mv www/v3/css/tokens.css www/css/tokens.css
git mv www/v3/css/trial.css www/css/trial.css
git mv www/v3/js/ablauf.js www/js/ablauf.js
git mv www/v3/js/chrome.de.js www/js/chrome.de.js
git mv www/v3/js/chrome.js www/js/chrome.js
git mv www/v3/js/dunning.js www/js/dunning.js
git mv www/v3/js/hero-agent.js www/js/hero-agent.js
git mv www/v3/js/hero.js www/js/hero.js
git mv www/v3/js/home-pipeline.js www/js/home-pipeline.js
git mv www/v3/js/orchestration.js www/js/orchestration.js
git mv www/v3/js/roi.js www/js/roi.js
git mv www/v3/js/supplier-chat.js www/js/supplier-chat.js
git mv www/v3/js/swimlanes.js www/js/swimlanes.js
git mv www/v3/js/testimonials.js www/js/testimonials.js
git mv www/v3/js/trial-form.js www/js/trial-form.js
git mv www/v3/js/viz-activate.js www/js/viz-activate.js
git mv www/v3/js/workflow.js www/js/workflow.js
[ -f www/v3/js/.gitkeep ] && git rm www/v3/js/.gitkeep
rmdir www/v3/css www/v3/js

Expected: both directories removed without error (empty after moves).

ls www/css/
ls www/js/
ls -d www/v3/css www/v3/js 2>&1

Expected CSS: globals.css product.css responsive.css tokens.css trial.css v3.css Expected JS: 19 files (4 original + 15 from v3) Expected last command: "No such file or directory" for both.

git commit -m "$(cat <<'EOF'
feat(www): promote v3 css and js into root www/css and www/js

No filename conflicts with the existing globals.css / main.js /
community-forms.js / orb.js / tracker.js — verified before moving.
Internal paths inside the v3 HTML still point to /v3/* and will be
fixed in the next two commits.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 4: Move v3 DE and EN content into /de and /en

Files:

After Task 1, the only things at www/de/ and www/en/ are community/ and 404.html. After this task, the full v3 page set joins them.

ls www/v3/de/

Expected: agb agenten datenschutz impressum implementierung index.html produkt roi steuerberater trial

ls www/v3/en/

Expected: agenten imprint implementierung index.html privacy produkt roi steuerberater terms trial

cd /Users/maximilianbrandstaetter/Orcha
git mv www/v3/de/index.html www/de/index.html
git mv www/v3/de/agb www/de/agb
git mv www/v3/de/agenten www/de/agenten
git mv www/v3/de/datenschutz www/de/datenschutz
git mv www/v3/de/impressum www/de/impressum
git mv www/v3/de/implementierung www/de/implementierung
git mv www/v3/de/produkt www/de/produkt
git mv www/v3/de/roi www/de/roi
git mv www/v3/de/steuerberater www/de/steuerberater
git mv www/v3/de/trial www/de/trial
git mv www/v3/en/index.html www/en/index.html
git mv www/v3/en/agenten www/en/agenten
git mv www/v3/en/imprint www/en/imprint
git mv www/v3/en/implementierung www/en/implementierung
git mv www/v3/en/privacy www/en/privacy
git mv www/v3/en/produkt www/en/produkt
git mv www/v3/en/roi www/en/roi
git mv www/v3/en/steuerberater www/en/steuerberater
git mv www/v3/en/terms www/en/terms
git mv www/v3/en/trial www/en/trial
rmdir www/v3/de www/v3/en www/v3

Expected: all three removed without error.

ls www/de/
ls www/en/
ls -d www/v3 2>&1

Expected DE: 404.html agb agenten community datenschutz implementierung impressum index.html produkt roi steuerberater trial Expected EN: 404.html agenten community imprint implementierung index.html privacy produkt roi steuerberater terms trial Expected last: "No such file or directory".

git commit -m "$(cat <<'EOF'
feat(www): move v3 de/ and en/ content into the live /de and /en

v3 page set now lives at the live URLs alongside the existing
community/ and 404.html. Internal /v3/ references inside these files
are fixed in the next commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 5: Fix chrome.js paths + strip /v3/ from all HTML

Files:

grep -rn "/v3/" www/ --include="*.html" --include="*.js" | wc -l
grep -rln "/v3/" www/ --include="*.html" --include="*.js"

Expected: a non-zero count, with files listed. Note the files — they're what we'll modify.

Run: grep -n "isSubpage\|logoSrc\|logoIconSrc\|homeHref\|moduleHref\|steuerberaterHref\|agentenHref\|roiHref\|implementierungHref\|impressumHref\|datenschutzHref\|agbHref\|anchorHref\|enHref\|deHref\|trial" www/js/chrome.de.js

Expected: lines showing the path-helper definitions (around line 30-50) and the trial CTA hrefs (around line 156, 170).

Replace the path-helper block (around lines 30-50) with absolute paths and remove the /v3/ regex from the language toggle:

  // Path helpers — absolute paths so the script works at any depth
  // (homepage, /de/produkt/*, /de/community/posts/<slug>/, etc.)
  const homeHref           = "/de/";
  const moduleHref         = (slug) => "/de/produkt/" + slug + ".html";
  const steuerberaterHref  = "/de/steuerberater/";
  const agentenHref        = "/de/agenten/";
  const roiHref            = "/de/roi/";
  const implementierungHref= "/de/implementierung/";
  const impressumHref      = "/de/impressum/";
  const datenschutzHref    = "/de/datenschutz/";
  const agbHref            = "/de/agb/";
  const anchorHref         = (anchor) => "/de/#" + anchor;
  const logoSrc            = "/logos/orcha-logo.png";
  const logoIconSrc        = "/logos/orcha-icon.png";

  // Language toggle — swap /de/ ↔ /en/ in the current path
  const deHref = location.pathname + location.hash;
  const enHref = location.pathname.replace(/\/de(\/|$)/, "/en$1") + location.hash;

Note: isProductSubpage, isOtherSubpage, and isSubpage detection regexes already use /de/ (not /v3/de/), so they continue to work for product subpages and community pages without changes. The isSubpage variable becomes unused for path computation but is still consumed for active-state styling — leave it in.

Also update the trial CTAs in chrome.de.js (around lines 156, 170):

sed -i '' 's|/v3/de/trial/|/de/trial/|g' www/js/chrome.de.js

Replace the path-helper block in www/js/chrome.js with the EN-locale equivalent:

  // Path helpers — absolute paths so the script works at any depth
  const homeHref           = "/en/";
  const moduleHref         = (slug) => "/en/produkt/" + slug + ".html";
  const steuerberaterHref  = "/en/steuerberater/";
  const agentenHref        = "/en/agenten/";
  const roiHref            = "/en/roi/";
  const implementierungHref= "/en/implementierung/";
  const imprintHref        = "/en/imprint/";
  const privacyHref        = "/en/privacy/";
  const termsHref          = "/en/terms/";
  const anchorHref         = (anchor) => "/en/#" + anchor;
  const logoSrc            = "/logos/orcha-logo.png";
  const logoIconSrc        = "/logos/orcha-icon.png";

  // Language toggle — swap /en/ ↔ /de/ in the current path
  const enHref = location.pathname + location.hash;
  const deHref = location.pathname.replace(/\/en(\/|$)/, "/de$1") + location.hash;

Important: the existing chrome.js uses German variable names (impressumHref, datenschutzHref, agbHref) — search for those identifiers in the file and rename to imprintHref, privacyHref, termsHref. Update both the declarations AND the references inside the renderHeader() / renderFooter() template strings.

sed -i '' 's|/v3/en/trial/|/en/trial/|g' www/js/chrome.js
sed -i '' 's|impressumHref|imprintHref|g' www/js/chrome.js
sed -i '' 's|datenschutzHref|privacyHref|g' www/js/chrome.js
sed -i '' 's|agbHref|termsHref|g' www/js/chrome.js

Note: if chrome.js already uses the EN names (imprintHref, etc.), the renames are no-ops — sed only replaces matches. Run them anyway for safety.

grep -n "/v3/" www/js/chrome.de.js www/js/chrome.js

Expected: no output (zero matches).

cd /Users/maximilianbrandstaetter/Orcha
grep -rl "/v3/de/" www/ --include="*.html" | xargs sed -i '' 's|/v3/de/|/de/|g'
grep -rl "/v3/en/" www/ --include="*.html" | xargs sed -i '' 's|/v3/en/|/en/|g'
grep -rn "/v3/" www/ --include="*.html" --include="*.js"

Expected: no output. If anything remains (e.g. a comment), inspect and edit manually.

grep -n "homeHref\|moduleHref\|logoSrc\|enHref\|trial/" www/js/chrome.de.js | head -20

Expected: all values use absolute paths starting with /, no /v3/.

git add www/
git commit -m "$(cat <<'EOF'
fix(chrome,www): switch chrome.js to absolute paths, strip /v3/ references

chrome.de.js and chrome.js now use absolute paths for all internal
links (homepage, modules, steuerberater, agenten, roi, etc.) and
logos. This makes the scripts depth-independent — they work on the
homepage, product subpages, AND on community posts at depth 3.

All HTML files have /v3/de/ and /v3/en/ stripped from canonicals,
hreflang, og:url, and in-body hrefs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 6: Wire v3 chrome into community pages and 404s

Files (68 total):

What changes in each file:

  1. Add <link rel="stylesheet" href="/css/v3.css"> to <head> (after the existing globals.css link)
  2. Rename <header id="site-navbar" class="..."><header id="site-header"></header> (drop the Tailwind classes; v3 chrome supplies styling)
  3. Leave <footer id="site-footer"></footer> unchanged (already matches what v3 chrome targets)
  4. Add <script src="/js/chrome.de.js"></script> (DE files) or <script src="/js/chrome.js"></script> (EN files) after the existing main.js script tag
grep -c "id=\"site-navbar\"" www/de/community/index.html www/en/community/index.html www/de/404.html www/en/404.html
grep -rc "id=\"site-navbar\"" www/de/community/posts/ www/en/community/posts/

Expected: every file returns 1 (one occurrence per file). If any return 0 or 2, inspect those files and adjust the strategy below.

Create scripts/wire-v3-chrome.sh:

#!/usr/bin/env bash
# One-shot helper to wire v3 chrome into community + 404 pages.
# Idempotent: skips a file if v3.css link is already present.

set -euo pipefail

apply_changes() {
  local file="$1"
  local chrome_script="$2"  # /js/chrome.de.js or /js/chrome.js

  # Skip if already wired
  if grep -q '/css/v3.css' "$file"; then
    echo "skip (already wired): $file"
    return
  fi

  # 1. Add v3.css link after globals.css link
  sed -i '' 's|\(<link rel="stylesheet" href="[^"]*globals\.css"[^/]*/>\)|\1\n  <link rel="stylesheet" href="/css/v3.css" />|' "$file"

  # 2. Rename header id and strip classes
  sed -i '' 's|<header id="site-navbar"[^>]*></header>|<header id="site-header"></header>|' "$file"

  # 3. Insert chrome script tag right after the main.js script tag
  sed -i '' "s|\(<script src=\"[^\"]*main\.js\"></script>\)|\1\n  <script src=\"${chrome_script}\"></script>|" "$file"

  echo "wired: $file"
}

# DE files
apply_changes www/de/community/index.html /js/chrome.de.js
apply_changes www/de/404.html /js/chrome.de.js
for f in www/de/community/posts/*/index.html; do
  apply_changes "$f" /js/chrome.de.js
done

# EN files
apply_changes www/en/community/index.html /js/chrome.js
apply_changes www/en/404.html /js/chrome.js
for f in www/en/community/posts/*/index.html; do
  apply_changes "$f" /js/chrome.js
done

echo "Done."

Make it executable:

chmod +x scripts/wire-v3-chrome.sh

Pick the DE community index as a canary. First, back it up:

cp www/de/community/index.html /tmp/community-index-before.html

Run on just that file by temporarily commenting out all but one line in the script, OR run inline:

file=www/de/community/index.html
sed -i '' 's|\(<link rel="stylesheet" href="[^"]*globals\.css"[^/]*/>\)|\1\n  <link rel="stylesheet" href="/css/v3.css" />|' "$file"
sed -i '' 's|<header id="site-navbar"[^>]*></header>|<header id="site-header"></header>|' "$file"
sed -i '' 's|\(<script src="[^"]*main\.js"></script>\)|\1\n  <script src="/js/chrome.de.js"></script>|' "$file"
grep -n "v3.css\|site-header\|site-navbar\|main.js\|chrome.de.js" www/de/community/index.html

Expected output (lines may differ, but order matters):

  1. <link rel="stylesheet" href="/css/v3.css" /> is present
  2. <header id="site-header"></header> is present
  3. No id="site-navbar" remains
  4. main.js script tag appears before chrome.de.js script tag
  5. chrome.de.js is on its own line right after main.js

If any item is wrong, restore the backup and debug:

cp /tmp/community-index-before.html www/de/community/index.html
cd /Users/maximilianbrandstaetter
python3 -m http.server 8000 --directory Orcha/www &
echo "Open http://localhost:8000/de/community/ in a browser"

Verify by eye:

Kill the server:

pkill -f "python3 -m http.server" 2>/dev/null || true
./scripts/wire-v3-chrome.sh

Expected: 68 "wired:" lines (DE community index already wired in step 3 will print "skip").

grep -L "/css/v3.css" www/de/community/index.html www/en/community/index.html www/de/404.html www/en/404.html
grep -rL "/css/v3.css" www/de/community/posts/ www/en/community/posts/

Expected: no output from either command (no files are missing the v3.css link).

grep -rln "id=\"site-navbar\"" www/de/community/ www/en/community/ www/de/404.html www/en/404.html

Expected: no output (all renamed).

grep -rln "chrome\.de\.js\|chrome\.js" www/de/community/ www/en/community/ www/de/404.html www/en/404.html | wc -l

Expected: 68.

python3 -m http.server 8000 --directory www &

Open each:

For each: v3 nav at top, v3 footer at bottom, body content unchanged from before, no console errors.

Kill server:

pkill -f "python3 -m http.server"

The script is single-use; keep the repo clean. It was never staged, so rm is sufficient.

rm scripts/wire-v3-chrome.sh
rmdir scripts 2>/dev/null || true   # remove the dir only if it's now empty
git add www/
git commit -m "$(cat <<'EOF'
feat(community,404): wire v3 header and footer into community pages and 404s

68 files updated: 2 community indexes + 64 community posts + 2 404
pages. Each gets a /css/v3.css link, renames the existing
#site-navbar element to #site-header (matching what chrome.js
targets), and gains a chrome script tag immediately after main.js.

main.js stays loaded because it still handles the cookie banner.
Script load order ensures chrome.js's footer overwrites main.js's.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Task 7: Regenerate sitemap.xml and update robots.txt

Files:

The sitemap needs these URLs (all https://getorcha.com/...):

DE top-level:

DE product pages (× 10):

DE community posts (× 37): list with

ls -1 www/de/community/posts/ | sed 's|^|https://getorcha.com/de/community/posts/|; s|$|/|'

EN mirror (substitute /en/ and rename legal pages):

ls -1 www/en/community/posts/ | sed 's|^|https://getorcha.com/en/community/posts/|; s|$|/|'

Root: https://getorcha.com/ (redirect, but include for completeness).

Look at the first <url> block in www/sitemap.xml for the template:

<url>
  <loc>https://getorcha.com/de/</loc>
  <lastmod>2026-05-16</lastmod>
  <changefreq>weekly</changefreq>
  <priority>1.0</priority>
  <xhtml:link rel="alternate" hreflang="de" href="https://getorcha.com/de/" />
  <xhtml:link rel="alternate" hreflang="en" href="https://getorcha.com/en/" />
  <xhtml:link rel="alternate" hreflang="x-default" href="https://getorcha.com/" />
</url>

Use this format. Pair DE and EN equivalents in each <url> block via the <xhtml:link> alternates.

Priority guidance:

lastmod: use 2026-05-16 for all (launch day).

changefreq: weekly for home/top-level, monthly for product/community, yearly for legal.

Replace www/sitemap.xml with the regenerated content. Group by section (home, top-level, products, community, legal) with XML comments for readability. Pair each DE url with its EN counterpart via hreflang alternates where they have direct mirrors. Community posts that exist in only one language (DE-only or EN-only — see lists from Step 1) get a self-hreflang and x-default pointing to the existing one.

To check which posts are DE-only vs EN-only vs both, see if the slug exists in both directories:

comm -23 <(ls www/de/community/posts/ | sort) <(ls www/en/community/posts/ | sort)
# → DE-only slugs (these have no EN equivalent)

comm -13 <(ls www/de/community/posts/ | sort) <(ls www/en/community/posts/ | sort)
# → EN-only slugs

comm -12 <(ls www/de/community/posts/ | sort) <(ls www/en/community/posts/ | sort)
# → Slugs present in both (likely none directly — DE and EN use different slugs e.g. "intro-claude")

Note: DE and EN posts mostly use different slugs (e.g. claude-shortcuts-tipps vs ai-shortcuts-tips). Don't try to auto-pair them by slug — treat them as independent posts for sitemap purposes, with hreflang self-references only.

xmllint --noout www/sitemap.xml

Expected: no output (silently passes). If errors, fix them.

grep -c "<loc>" www/sitemap.xml

Expected count: 1 (root) + 2 (DE/EN home) + 10 (DE top + legal: 5 + 3 + community) + 10 (DE products) + 37 (DE posts) + 10 (EN top: 5 + 3 + community + community already counted) + 10 (EN products) + 27 (EN posts).

Actual breakdown:

Total: 105 URLs.

test "$(grep -c "<loc>" www/sitemap.xml)" -eq 105 && echo "OK" || echo "MISMATCH — recount"

Open www/robots.txt (3 lines currently) and add Disallow: /archive/:

User-agent: *
Allow: /
Disallow: /archive/
Sitemap: https://getorcha.com/sitemap.xml
cat www/robots.txt

Expected: the 4-line content above.

git add www/sitemap.xml www/robots.txt
git commit -m "$(cat <<'EOF'
chore(www): regenerate sitemap.xml for v3 page set, disallow /archive/

Sitemap rebuilt from the live v3 URL set: 105 URLs covering homepages,
top-level subpages, 10 product pages per language, both community
indexes, all 64 community posts, and legal pages. /archive/ is
excluded from the sitemap and disallowed in robots.txt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EOF
)"

Pre-merge full smoke test

Before opening the PR / triggering deploy.

cd /Users/maximilianbrandstaetter/Orcha
python3 -m http.server 8000 --directory www &

Open each URL in a browser and verify (no console errors, correct chrome, working CTAs):

On /de/produkt/kreditoren.html, click the EN toggle. Expected URL: /en/produkt/kreditoren.html. Same product, EN content.

From the homepage, click each top-nav item and the "Jetzt registrieren" / "Sign up" button. All should resolve without 404.

grep -rn "/v3/" www/ --include="*.html" --include="*.js" --include="*.css" --include="*.xml" --include="*.txt"

Expected: zero results.

pkill -f "python3 -m http.server"
git log master..HEAD --oneline

Expected: 7 commits in order: archive → delete drafts → promote css/js → move de/en → fix paths → wire chrome → sitemap/robots.


Handoff

The branch is ready for the user to review and merge. Do not push or trigger deploy without explicit user confirmation.

When the user is ready:

git push -u origin v3-launch
gh pr create --title "Launch v3 as main site, archive old site" --body "$(cat <<'EOF'
## Summary

- Promotes www/v3/ to live at getorcha.com/de/ and /en/
- Archives current site to getorcha.com/archive/
- Wires v3 header + footer into 64 community posts, 2 community indexes, and 2 404 pages
- Deletes v3 drafts and exploration files
- Regenerates sitemap.xml (105 URLs), adds Disallow: /archive/ to robots.txt

See [spec](docs/superpowers/specs/2026-05-16-v3-launch-and-archive-design.md) for full design.

## Test plan

- [ ] Smoke test all top-level pages locally (see pre-merge checklist in plan)
- [ ] Trial form submits successfully
- [ ] Language toggle works from a deep page
- [ ] No /v3/ references remain
- [ ] Archive pages still load (acceptable if CSS partly broken)
- [ ] Trigger CodePipeline manually after merge

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"

User triggers AWS CodePipeline manually via the GitHub Actions workflow deploy.yml (workflow_dispatch).


Post-deploy verification