diff --git a/mascot/README.md b/mascot/README.md
index 5520a8c..bad99af 100644
--- a/mascot/README.md
+++ b/mascot/README.md
@@ -61,6 +61,21 @@ by hand. Every piece comes in three forms:
| `walk/patch-walk-animated` (0.96 s loop) | `.svg` (6.9 MB), `.webp` 512 × 352 | `.webp` 256 × 176 | `.svg` (1.2 MB), `.svgz` (2.6 MB), `.webp` 256 × 176 |
| `walk/frames/patch-walk-0N` (eight frames) | `.svg` and `.png` 1024 × 704 | `.png` 256 × 176 | `.svg` and `.svgz` |
+### Walking left (from the walk cycle)
+
+The approved left-facing walk, for anything that moves Patch to the left (a pet that follows the
+pointer, a loan heading back). It is the walk cycle mirrored exactly by the script, never by hand, so
+it shows Patch's other side. Same sizes, frames and timing as the walk cycle:
+
+| File | Full | Original | Compressed |
+|---|---|---|---|
+| `walk-left/patch-walk-left` (walking pose) | `.svg`, `.png` 1920 × 1440 | `.png` 480 × 360 | `.svg`, `.svgz` |
+| `walk-left/patch-walk-left-animated` (0.96 s loop) | `.svg`, `.webp` 512 × 352 | `.webp` 256 × 176 | `.svg`, `.svgz`, `.webp` 256 × 176 |
+| `walk-left/frames/patch-walk-left-0N` (eight frames) | `.svg` and `.png` 1024 × 704 | `.png` 256 × 176 | `.svg` and `.svgz` |
+
+Frame N of `walk-left/` is frame N of `walk/` facing the other way, on the same ground line, so you
+can switch direction mid-stride without a jump.
+
**Which one to use:**
- **Product UI** (apps, the web, chat): the animated **WebP**, or `compressed/` for the lightest.
@@ -96,6 +111,8 @@ node scripts/cut-mascot.mjs
Pass `concept` or `walk` to rebuild just one sheet. If a new sheet has a different layout, update its
boxes in `SHEETS` at the top of the script first. A higher-resolution sheet gives finer vectors.
+Rebuilding the walk also rebuilds `walk-left/`; pass `walk-left` to rebuild only that, from the current
+walk files, in a few seconds and without tracing.
**How faithful the vectors are.** The trace settings were chosen by rendering each candidate and scoring
it against the sheet pixel by pixel. At the chosen settings about 0.27% of pixels differ visibly. Going
@@ -160,7 +177,8 @@ Patch is the friendly face of the product. **The box symbol is still the logo.**
## Keep Patch intact
1. **Don't** recolour, filter or redraw Patch. Use these files as they are.
-2. **Don't** stretch, skew or mirror Patch. The coat is asymmetric on purpose.
+2. **Don't** stretch, skew or mirror Patch. The coat is asymmetric on purpose. To show Patch heading
+ left, use the approved `walk-left/` files; never flip the other files with CSS or an editor.
3. **Don't** add shadows, glows, gradients or outlines.
4. **Don't** make Patch fierce: no bared teeth, angry brows or hunting poses.
5. **Don't** scale up the PNGs or WebPs past their size. Use the full SVGs when you need bigger.
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-01.svg b/mascot/compressed/walk-left/frames/patch-walk-left-01.svg
new file mode 100644
index 0000000..98c642d
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-01.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-01.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-01.svgz
new file mode 100644
index 0000000..b0e860f
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-01.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-02.svg b/mascot/compressed/walk-left/frames/patch-walk-left-02.svg
new file mode 100644
index 0000000..7513994
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-02.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-02.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-02.svgz
new file mode 100644
index 0000000..b1b59a8
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-02.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-03.svg b/mascot/compressed/walk-left/frames/patch-walk-left-03.svg
new file mode 100644
index 0000000..8484bd6
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-03.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-03.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-03.svgz
new file mode 100644
index 0000000..3b0a2be
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-03.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-04.svg b/mascot/compressed/walk-left/frames/patch-walk-left-04.svg
new file mode 100644
index 0000000..c462e90
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-04.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-04.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-04.svgz
new file mode 100644
index 0000000..e5670c4
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-04.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-05.svg b/mascot/compressed/walk-left/frames/patch-walk-left-05.svg
new file mode 100644
index 0000000..ea7396c
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-05.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-05.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-05.svgz
new file mode 100644
index 0000000..15385fa
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-05.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-06.svg b/mascot/compressed/walk-left/frames/patch-walk-left-06.svg
new file mode 100644
index 0000000..a8644b7
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-06.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-06.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-06.svgz
new file mode 100644
index 0000000..d11f385
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-06.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-07.svg b/mascot/compressed/walk-left/frames/patch-walk-left-07.svg
new file mode 100644
index 0000000..a37c373
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-07.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-07.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-07.svgz
new file mode 100644
index 0000000..fadb5c9
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-07.svgz differ
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-08.svg b/mascot/compressed/walk-left/frames/patch-walk-left-08.svg
new file mode 100644
index 0000000..f9520b0
--- /dev/null
+++ b/mascot/compressed/walk-left/frames/patch-walk-left-08.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/frames/patch-walk-left-08.svgz b/mascot/compressed/walk-left/frames/patch-walk-left-08.svgz
new file mode 100644
index 0000000..b2a357f
Binary files /dev/null and b/mascot/compressed/walk-left/frames/patch-walk-left-08.svgz differ
diff --git a/mascot/compressed/walk-left/patch-walk-left-animated.svg b/mascot/compressed/walk-left/patch-walk-left-animated.svg
new file mode 100644
index 0000000..b18b325
--- /dev/null
+++ b/mascot/compressed/walk-left/patch-walk-left-animated.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/patch-walk-left-animated.svgz b/mascot/compressed/walk-left/patch-walk-left-animated.svgz
new file mode 100644
index 0000000..709866c
Binary files /dev/null and b/mascot/compressed/walk-left/patch-walk-left-animated.svgz differ
diff --git a/mascot/compressed/walk-left/patch-walk-left-animated.webp b/mascot/compressed/walk-left/patch-walk-left-animated.webp
new file mode 100644
index 0000000..9e6261a
Binary files /dev/null and b/mascot/compressed/walk-left/patch-walk-left-animated.webp differ
diff --git a/mascot/compressed/walk-left/patch-walk-left.svg b/mascot/compressed/walk-left/patch-walk-left.svg
new file mode 100644
index 0000000..4e6e299
--- /dev/null
+++ b/mascot/compressed/walk-left/patch-walk-left.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/compressed/walk-left/patch-walk-left.svgz b/mascot/compressed/walk-left/patch-walk-left.svgz
new file mode 100644
index 0000000..6a852cb
Binary files /dev/null and b/mascot/compressed/walk-left/patch-walk-left.svgz differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-01.png b/mascot/original/walk-left/frames/patch-walk-left-01.png
new file mode 100644
index 0000000..dcdde5e
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-01.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-02.png b/mascot/original/walk-left/frames/patch-walk-left-02.png
new file mode 100644
index 0000000..8b0f659
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-02.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-03.png b/mascot/original/walk-left/frames/patch-walk-left-03.png
new file mode 100644
index 0000000..6c0bb21
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-03.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-04.png b/mascot/original/walk-left/frames/patch-walk-left-04.png
new file mode 100644
index 0000000..4710cb0
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-04.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-05.png b/mascot/original/walk-left/frames/patch-walk-left-05.png
new file mode 100644
index 0000000..3e2e2bc
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-05.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-06.png b/mascot/original/walk-left/frames/patch-walk-left-06.png
new file mode 100644
index 0000000..57dd880
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-06.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-07.png b/mascot/original/walk-left/frames/patch-walk-left-07.png
new file mode 100644
index 0000000..67c966d
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-07.png differ
diff --git a/mascot/original/walk-left/frames/patch-walk-left-08.png b/mascot/original/walk-left/frames/patch-walk-left-08.png
new file mode 100644
index 0000000..6000e10
Binary files /dev/null and b/mascot/original/walk-left/frames/patch-walk-left-08.png differ
diff --git a/mascot/original/walk-left/patch-walk-left-animated.webp b/mascot/original/walk-left/patch-walk-left-animated.webp
new file mode 100644
index 0000000..eedeb14
Binary files /dev/null and b/mascot/original/walk-left/patch-walk-left-animated.webp differ
diff --git a/mascot/original/walk-left/patch-walk-left.png b/mascot/original/walk-left/patch-walk-left.png
new file mode 100644
index 0000000..b8e9909
Binary files /dev/null and b/mascot/original/walk-left/patch-walk-left.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-01.png b/mascot/walk-left/frames/patch-walk-left-01.png
new file mode 100644
index 0000000..18e20d7
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-01.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-01.svg b/mascot/walk-left/frames/patch-walk-left-01.svg
new file mode 100644
index 0000000..38d65d3
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-01.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-02.png b/mascot/walk-left/frames/patch-walk-left-02.png
new file mode 100644
index 0000000..a0a4f21
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-02.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-02.svg b/mascot/walk-left/frames/patch-walk-left-02.svg
new file mode 100644
index 0000000..ab80367
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-02.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-03.png b/mascot/walk-left/frames/patch-walk-left-03.png
new file mode 100644
index 0000000..8d0ad88
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-03.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-03.svg b/mascot/walk-left/frames/patch-walk-left-03.svg
new file mode 100644
index 0000000..f700c06
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-03.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-04.png b/mascot/walk-left/frames/patch-walk-left-04.png
new file mode 100644
index 0000000..8461c06
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-04.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-04.svg b/mascot/walk-left/frames/patch-walk-left-04.svg
new file mode 100644
index 0000000..94ed3f8
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-04.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-05.png b/mascot/walk-left/frames/patch-walk-left-05.png
new file mode 100644
index 0000000..39abc34
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-05.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-05.svg b/mascot/walk-left/frames/patch-walk-left-05.svg
new file mode 100644
index 0000000..8f7ab97
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-05.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-06.png b/mascot/walk-left/frames/patch-walk-left-06.png
new file mode 100644
index 0000000..d1cc254
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-06.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-06.svg b/mascot/walk-left/frames/patch-walk-left-06.svg
new file mode 100644
index 0000000..ec522e2
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-06.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-07.png b/mascot/walk-left/frames/patch-walk-left-07.png
new file mode 100644
index 0000000..f33fa13
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-07.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-07.svg b/mascot/walk-left/frames/patch-walk-left-07.svg
new file mode 100644
index 0000000..ad885d4
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-07.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/frames/patch-walk-left-08.png b/mascot/walk-left/frames/patch-walk-left-08.png
new file mode 100644
index 0000000..9a3cd05
Binary files /dev/null and b/mascot/walk-left/frames/patch-walk-left-08.png differ
diff --git a/mascot/walk-left/frames/patch-walk-left-08.svg b/mascot/walk-left/frames/patch-walk-left-08.svg
new file mode 100644
index 0000000..9443aea
--- /dev/null
+++ b/mascot/walk-left/frames/patch-walk-left-08.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/patch-walk-left-animated.svg b/mascot/walk-left/patch-walk-left-animated.svg
new file mode 100644
index 0000000..b5ca949
--- /dev/null
+++ b/mascot/walk-left/patch-walk-left-animated.svg
@@ -0,0 +1 @@
+
diff --git a/mascot/walk-left/patch-walk-left-animated.webp b/mascot/walk-left/patch-walk-left-animated.webp
new file mode 100644
index 0000000..c5b4b44
Binary files /dev/null and b/mascot/walk-left/patch-walk-left-animated.webp differ
diff --git a/mascot/walk-left/patch-walk-left.png b/mascot/walk-left/patch-walk-left.png
new file mode 100644
index 0000000..56c4ebc
Binary files /dev/null and b/mascot/walk-left/patch-walk-left.png differ
diff --git a/mascot/walk-left/patch-walk-left.svg b/mascot/walk-left/patch-walk-left.svg
new file mode 100644
index 0000000..d94a8bb
--- /dev/null
+++ b/mascot/walk-left/patch-walk-left.svg
@@ -0,0 +1 @@
+
diff --git a/site/scripts/cut-mascot.mjs b/site/scripts/cut-mascot.mjs
index cb6404c..62db923 100644
--- a/site/scripts/cut-mascot.mjs
+++ b/site/scripts/cut-mascot.mjs
@@ -14,9 +14,13 @@
//
// The loops are built from the frames as animated SVGs (CSS only, plays in ) and animated WebPs.
//
-// Run from site/ after replacing a sheet: node scripts/cut-mascot.mjs [concept|walk]
+// walk-left/ is the approved left-facing walk: every walk file mirrored exactly (vectors, pixels and
+// loops), so Patch can head left without anyone flipping the artwork by hand. It is rebuilt with the
+// walk sheet, or on its own from the current walk files.
+//
+// Run from site/ after replacing a sheet: node scripts/cut-mascot.mjs [concept|walk|walk-left]
// (no argument rebuilds both sheets; tracing the concept sheet takes a few minutes)
-import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
+import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
import { gzipSync } from 'node:zlib';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
@@ -294,3 +298,42 @@ for (const s of SHEETS.filter((s) => !only || s.sheet.includes(only))) {
console.log(`cut-mascot: ${s.sheet} -> ${s.hero.out}, ${s.frames.length} frames, ${s.animated}`);
}
+
+// walk-left/: the walk files mirrored. SVGs get one mirroring group around their artwork, PNGs are
+// flopped, and the loops are rebuilt from the flopped frames with the walk's own encoder settings.
+const left = (out) => out.replace(/^walk\//, 'walk-left/').replace('patch-walk', 'patch-walk-left');
+const mirrorSvg = (svg, title) =>
+ svg.replace(/^([\s\S]*?viewBox="0 0 (\d+) \d+"[\s\S]*?