# Brand.Brief — Rollback Index

Each entry below is a directory at the root of `CLAUDE_projects/Webpage_BrandBrief/` containing a snapshot of the brandbrief.eu live state (or, in the case of `_test_deploy_*`, the artefacts deployed to the `/test/` sandbox). To roll back, FTPS-upload the files in the chosen folder over the live root.

**Naming scheme** *(introduced 2026-06-04 as part of staging v0.1.1.2)*: `_v<VERSION>_<original-folder-name>` — version prefix first, original date suffix kept for context.

**Pre-versioning era = v0.0.1.x** (one build per snapshot, chronological).
**Today onward = v0.1.x.y** matching the staging `VERSION` file.

## Index

| Version | Folder | Captured | What was in it / why backed up |
|---|---|---|---|
| **✅ current · complete** | `_v_complete_current_20260617` | 2026-06-17 | **Vollständiger, selbst-enthaltener Snapshot des aktuellen Stands** — alle Assets (HTML, CSS, Bilder, JSON), Token-Dateien (`*.php`/config) ausgeschlossen. **Rendert vollständig** (CSS + Bilder) im Gegensatz zu den älteren Teil-Backups. Klick öffnet die komplette aktuelle Seite. |
| **v0.0.1.1** | `_v0.0.1.1_live_backup_20260527-093113` | 2026-05-27 09:31 | First deploy session of the day |
| **v0.0.1.2** | `_v0.0.1.2_live_backup_20260527-1139` | 2026-05-27 11:39 | Pre-deploy of first FTPS:21 success |
| **v0.0.1.3** | `_v0.0.1.3_live_backup_20260527-1216` | 2026-05-27 12:16 | Post-deploy verification snapshot |
| **v0.0.1.4** | `_v0.0.1.4_live_backup_20260528` | 2026-05-28 18:51 | Pre-deploy supporter-logo add (KEA + b.creative) |
| **v0.0.1.5** | `_v0.0.1.5_live_backup_20260601` | 2026-06-01 21:35 | Pre-deploy state, June 1 evening |
| **v0.0.1.6** | `_v0.0.1.6_live_backup_20260602` | 2026-06-02 10:00 | Morning baseline |
| **v0.0.1.7** | `_v0.0.1.7_live_backup_20260602_predeploy` | 2026-06-02 16:57 | Pre-postcode-field deploy |
| **v0.0.1.8** | `_v0.0.1.8_live_backup_20260602_postcodedeploy` | 2026-06-02 18:45 | After postcode-field deploy |
| **v0.0.1.9** | `_v0.0.1.9_live_backup_20260602_frontenddeploy` | 2026-06-02 18:53 | After frontend-only deploy |
| **v0.0.1.10** | `_v0.0.1.10_live_backup_20260602b` | 2026-06-02 20:23 | Evening state |
| **v0.0.1.11** | `_v0.0.1.11_live_snapshot_20260603` | 2026-06-03 10:55 | Morning live snapshot (before popup-sync work) |
| **v0.0.1.12** | `_v0.0.1.12_pre_sync_backup_20260603_1056` | 2026-06-03 10:57 | Pre-merge of local working-copy with live (popup spliced in) |
| **v0.0.1.13** | `_v0.0.1.13_live_snapshot_predeploy_20260603_1244` | 2026-06-03 12:44 | Pre-deploy of popup |
| **v0.0.1.14** | `_v0.0.1.14_test_deploy_staging_20260603_1244` | 2026-06-03 14:59 | First `/test/`-subpath deploy (popup preview) |
| **v0.0.1.15** | `_v0.0.1.15_test_deploy_staging_20260603_1545` | 2026-06-03 16:34 | Second `/test/` deploy iteration |
| **v0.0.1.16** | `_v0.0.1.16_live_snapshot_predeploy_20260603_1700` | 2026-06-03 17:11 | Pre-legal-page deploy ([[reference_brandbrief_legal_page]]) |
| **v0.0.1.17** | `_v0.0.1.17_test_deploy_staging_20260603_1829` | 2026-06-03 19:07 | Third `/test/` deploy |
| **v0.0.1.18** | `_v0.0.1.18_live_snapshot_predeploy_20260603_1920` | 2026-06-03 19:17 | Pre-popup-go-live · **contains `rollback.sh`** (deactivates popup) |
| **v0.0.1.19** | `_v0.0.1.19_live_snapshot_predeploy_20260603_1925` | 2026-06-03 19:23 | Final pre-popup-deploy state |
| **v0.0.1.20** | `_v0.0.1.20_staging_archive_testpath_20260604_1520` | 2026-06-04 15:21 | `/test/`-based staging workspace archived (before switching to production-mirror) |
| **v0.0.1.20pre** | `_v0.0.1.20pre_pull_test_subpath_20260604_1500` | 2026-06-04 15:01 | Pull source of v0.0.1.20 (identical content, from server) |
| **v0.1.0** | `_v0.1.0_pull_production_20260604_1500` | 2026-06-04 15:21 | Production root pulled — baseline of new staging workspace |
| **v0.1.2.5-pre** | `_v0.1.2.5_predeploy_live_backup_20260604_1645` | 2026-06-04 17:03 | Production snapshot taken just before deploying v0.1.2.5 (sticky footer + version system + staging banner + popup X fix + first-person popup copy + privacy note + IMPRINT-only footer label) to brandbrief.eu live |
| **v0.3.0.3-pre** | `_v0.3.0.3_predeploy_live_backup_20260605_2050` | 2026-06-05 20:49 | Production snapshot taken just before deploying v0.3.0.3 to brandbrief.eu. Includes 3 edits done in a parallel context-window earlier today (manifesto-signee checkbox required + extended, publish_consent reworded with 'also/keep private', new name_masked checkbox). Deploy then added: Tab-UI in Signatories (Orgs/Citizens), petition.html DRAFT page with unconditional submit-block, signatories-tabs.js, petition.css/.js, citizens.json=[], rolled all the v0.1.2.5–v0.3.0.3 fixes back onto live (popup X, popup copy, privacy note, sticky footer, version footer JS now functional). |
| **v0.3.2.0** | `_v0.3.2.0_pull_production_20260618_1058` | 2026-06-18 10:58 | **Live-SSOT-Pull = Versions-Stempel-Resync.** Der Live-Inhalt war bereits byte-gleich mit Staging; nur der Live-`VERSION`-Stempel hing auf `0.3.1.0` und wurde per Einzeldatei-FTPS-Upload auf `0.3.2.0` gehoben (kein Inhalt angefasst; `toolkit.html` WIP unberührt, auf Live weiter 404). Dieser Ordner = vollständiger Static-Pull der Live-Root (HTML/CSS/JS/JSON, PHP/config ausgenommen) + img/doc-Symlinks → rendert komplett. **Kanonischer 0.3.2.0-Org-Seiten-Stand.** Rollback = Ordner-Inhalte per FTPS:21 über die Live-Root spielen. Predeploy-Backup des alten Live-Stempels: `brand.brief.eu_staging/_version_resync_predeploy_live_backup_20260618_1051/VERSION.live_before` (`0.3.1.0`). |

## Petition — eigener Versions-Tree

Die Petitions-Seite (`petition.html`) hat einen **eigenen Versions-Baum** (2-segment `vMAJOR.MINOR`), getrennt von der Site-VERSION oben. Snapshots liegen in `brand.brief.eu_staging/_petition_versions/`. Footer der Petition zieht `PETITION_VERSION`. Bump + Snapshot via `./_petition_version_bump.sh [minor|major] "note"`. Detail-Log: `brand.brief.eu_staging/PETITION_CHANGELOG.md`.

*Vor-Historie:* Die Petition lief vorher in der Site-VERSION mit (Site-v0.2.0.0 erster Draft 2026-06-04 → v0.3.1.26 letzte Überarbeitung 2026-06-09) und wurde nicht separat snapshottet. Der eigene Baum startet mit **v1.0** als Baseline.

| Version | Folder | Captured | What was in it / why backed up |
|---|---|---|---|
| **v1.0** | `_petition_versions/pet_v1.0_20260616` | 2026-06-16 | Baseline des eigenen Petitions-Versions-Baums = damaliger Staging-Stand (Jun-9-Inhalte: Demand 00, content-layer-Texte, gekürzte Demands 01–05, Hero-Feinschliff). Footer auf PETITION_VERSION umgestellt. |
| **v1.0-live** | `_petition_versions/pet_v1.0-live_golive_predeploy_20260617_1132` | 2026-06-17 11:32 | **Citizen petition GO-LIVE.** Pre-deploy-Backup der Live-Seite (alte „opens soon"-Platzhalterseite) direkt vor dem Deploy der funktionierenden Petition (petition.html, petition.js, script.js, styles.css, PETITION_VERSION) auf brandbrief.eu. Dieser Build: Demand 01 „Put €760 million back on the table…" (790→760 vereinheitlicht), Article-30-Skills-Guarantee-Link, „// The Five Demands"-Zwischenüberschrift (dunkelrotes Kästchen) + CTA-Box, maskierte Bürger-Wall (citizens.json, 95 Alt-Unterzeichner default-maskiert). Backend: signon.php v3.1 (`list=citizens`→Liste 13), refresh_citizens.php. Rollback = Ordner-Inhalte per FTPS zurückspielen. Begleit-Backups: `brand.brief.eu/signon.php.live_backup_20260617`, `brand.brief.eu/_citizens_list13_backup_20260617.json`. |
| **v1.1** 🔒 | `_petition_versions/pet_v1.1_20260618` (petition.html/css/js) · **komplett:** `_v_lockin_20260618_petition-rework` (alle Front- + Backend-Dateien außer config.php) | 2026-06-18 | **LOCK-IN nach Petition-Rework-Session.** Petition zeigt die **volle Citizen-Liste** (kein publish_consent-Filter; maskiert 4-Zeichen-Vorname bzw. **voller Name** wenn unmaskiert), **helle Wall** im dunklen Abschnitt. Backend: **Mirror** in `refresh_citizens.php` (zählt bestätigte + „unterschrieben & anderswo verifiziert" = Bestands-Abonnenten) + **Sekunden-Trigger** `ping_refresh.php` (Cooldown 2s) ⊕ Listmonk Custom-JS-Beacon; Stunden-Cron als Backstop. Popup-CTA: „creative professional" → Petition-Formular (`petition.html#sign`) + scroll-to-#sign-Fix. Texte: „Sign & Confirm via Email", „What we demand", „Five Demands", „// 01 WHAT WE DEMAND", Häkchen „…signee of the petition" + „petition list", Petition-Häkchen „…sign the Brand.Brief Petition". `signon.php` **unverändert** (Live = v3.1). Rollback = Ordner-Inhalte per FTPS zurückspielen. |

## Going forward

- Each significant pre-deploy backup goes here and is named `_v<staging-version>_<kind>_<date>`.
- `kind` ∈ {`live_backup`, `live_snapshot`, `pre_sync_backup`, `test_deploy_staging`, `pull_production`, `staging_archive`}.
- After the backup is in place, `_version_bump.sh` is bumped and the CHANGELOG entry notes which rollback ID the build corresponds to.

## How to roll back

For most snapshots: open the folder, push its contents back to the brandbrief.eu webroot via FTPS:21 ([[workflow_deploy_brandbrief_website]]). For v0.0.1.18 there is a ready-made `rollback.sh` inside.

If a rollback is needed, **always make a fresh backup of the current live state first** (call it the next-up v0.0.1.x.rollback or v0.1.x.rollback) — the live state at moment-of-rollback is also a state worth being able to come back to.

## Related

- [[workflow_deploy_brandbrief_website]] — the FTPS:21 deploy path
- [[reference_keychain_tcc_launchd]] — keychain access pattern (needed for restore from Claude shell)
- [[project_brandbrief_signon_doi_fix]] — context for signon.php v1/v2/v3 in `brand.brief.eu/signon.php.live_backup_*` (these are SEPARATE in-place backups, not in this index)
- `brand.brief.eu_staging/CHANGELOG.md` — version history of the local working copy
