diff --git a/plans/astro-refactor/task-15d-page-full-guide.md b/plans/astro-refactor/task-15d-page-full-guide.md
index 140d906..4bc2f78 100644
--- a/plans/astro-refactor/task-15d-page-full-guide.md
+++ b/plans/astro-refactor/task-15d-page-full-guide.md
@@ -56,3 +56,47 @@ re-points them to output-level checks; you do not.
- [ ] Screenshots match at 560 / 800 / 1100 / 1600 px
- [ ] `pnpm run gate` green — the full gate, not `verify` + `audit-ui` alone
- [ ] 42 assertions intact
+
+## What 15a, 15b and 15c actually shipped
+
+Read `.agents/context/content-i18n.md` first — it is the language contract and
+it is binding on this task.
+
+- **`src/components/islands/GuideSelector.astro`** — one island, all nine
+ groups. Render it as
+ `
` exactly once on the + page; the island writes into it. Fill the `
` bodies
+ from the `handsOnPrompts` and `skillInstallPrompts` collections — 15b verified
+ those are byte-identical to the legacy `app.js` constants, and the clipboard
+ copies whatever you render, so do not reformat them.
+- **`src/components/islands/ReadingProgress.astro`** — replaces the legacy
+ `` at the top of the page.
+
+Nothing else is missing. If you are about to write an island, you are doing
+another task's work — report the gap instead.
+
+## Two things to expect
+
+- **The snapshot will not match by construction.** Dual-locale rendering emits
+ both languages into the HTML where today's page emits English plus a
+ Portuguese map inside `app.js`. Compare _rendered, language-filtered_ output
+ against today's page, and if `.agents/snapshots/` needs regenerating, say so
+ explicitly in your report with what changed and why — do not quietly rewrite a
+ snapshot to make a diff go away.
+- **`renderHandsOn` takes no argument** and is not part of GuideSelector's
+ nine-group pattern. It is yours. Its name is asserted by `verify.mjs`.