diff --git a/AGENTS.md b/AGENTS.md
index a4de7bac5..1917d6c42 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -84,8 +84,12 @@ trust the theme, so a commit message is part of the product.
- **Never narrate the process.** No first-person account of what was tried,
what was missed, or what was learned. "The gate is scoped to the demo
deployment" belongs here; "I only tested two states" does not.
-- **No tool or session trailers.** No `Co-Authored-By` for an assistant, and no
- links to an AI session. Some tooling adds these by default — remove them.
+- **Assistant trailers stay.** A commit written with an assistant ends with a
+ `Co-Authored-By` line naming it and a `Claude-Session` link to the session
+ that produced it. The tooling adds both and they are kept, so the authorship
+ recorded on a commit matches who wrote it. This file asked for them to be
+ stripped until 2026-09-05, while 218 commits on `main` carried them; the rule
+ now says what the history does.
- **Present tense, describing the code after the change.** "Scope demo content
to the demo deployment", not "Fixed the demo leaking".
- **The subject names the change; it does not argue for it.** "Rewrite the
diff --git a/src/assets/projects/astro-rocket-hero-blue.jpg b/src/assets/projects/astro-rocket-hero-blue.jpg
new file mode 100644
index 000000000..de7bc03a5
Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-blue.jpg differ
diff --git a/src/assets/projects/astro-rocket-hero-purple.jpg b/src/assets/projects/astro-rocket-hero-purple.jpg
new file mode 100644
index 000000000..c9e5b2b4d
Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-purple.jpg differ
diff --git a/src/assets/projects/astro-rocket-hero-teal.jpg b/src/assets/projects/astro-rocket-hero-teal.jpg
new file mode 100644
index 000000000..0dd05184e
Binary files /dev/null and b/src/assets/projects/astro-rocket-hero-teal.jpg differ
diff --git a/src/assets/projects/ecommerce-store-catalog.svg b/src/assets/projects/ecommerce-store-catalog.svg
deleted file mode 100644
index a2c776b0a..000000000
--- a/src/assets/projects/ecommerce-store-catalog.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
diff --git a/src/assets/projects/ecommerce-store-checkout.svg b/src/assets/projects/ecommerce-store-checkout.svg
deleted file mode 100644
index 24fe74c05..000000000
--- a/src/assets/projects/ecommerce-store-checkout.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
diff --git a/src/assets/projects/ecommerce-store-product.svg b/src/assets/projects/ecommerce-store-product.svg
deleted file mode 100644
index d6e5c5599..000000000
--- a/src/assets/projects/ecommerce-store-product.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
diff --git a/src/assets/projects/hans-martens-dev-astro-rocket.jpg b/src/assets/projects/hans-martens-dev-astro-rocket.jpg
deleted file mode 100644
index a0ed143b4..000000000
Binary files a/src/assets/projects/hans-martens-dev-astro-rocket.jpg and /dev/null differ
diff --git a/src/components/projects/ProjectCarousel.astro b/src/components/projects/ProjectCarousel.astro
index 9c3929316..190286d96 100644
--- a/src/components/projects/ProjectCarousel.astro
+++ b/src/components/projects/ProjectCarousel.astro
@@ -111,8 +111,13 @@ const posters = await Promise.all(
+ {/* The dot a visitor sees is 8px, which is far below the 24px minimum
+ a touch target needs. The button carries the 24x24 target and the
+ span carries the appearance, so the control is thumb-sized without
+ drawing a thumb-sized dot. The row has no gap: the targets meet
+ edge to edge rather than overlapping. */}
(
+ >
+
+
))}
-
+ {/* As in ProjectCarousel: the button carries a 24x24 touch target and the
+ span carries the 6px dot, so the control is thumb-sized without the
+ dot growing. The active state is an attribute rather than a rewritten
+ class list, so the target sizing cannot be overwritten at runtime. */}
+