diff --git a/src/components/blocks/GridGroup.astro b/src/components/blocks/GridGroup.astro
new file mode 100644
index 0000000..941289f
--- /dev/null
+++ b/src/components/blocks/GridGroup.astro
@@ -0,0 +1,48 @@
+---
+// GridGroup — gap:1px hairline-separated card grid wrapper.
+//
+// The separator technique is deliberate house style: a `gap: 1px` over a
+// coloured parent background fakes borders without `border` shorthand. Each
+// direct child paints its own background, which is what makes the 1px seam
+// show. Do not "fix" this into `border`.
+//
+// Built from `.agents/templates/components/grid-group.astro` per task 08 of
+// the Astro refactor. The landing page wraps six `RouteCard` instances in
+// this group; the route-grid layout also pushes each card's link to the
+// bottom, which `RouteCard` carries itself so this wrapper stays generic.
+
+interface Props {
+ /** Accessible label for the group, surfaced as `aria-label` on the section. */
+ label: string;
+ /** Number of columns at the widest breakpoint. */
+ columns?: number;
+}
+
+const { label, columns = 3 } = Astro.props;
+---
+
+
+
+
diff --git a/src/components/blocks/RouteCard.astro b/src/components/blocks/RouteCard.astro
new file mode 100644
index 0000000..f076921
--- /dev/null
+++ b/src/components/blocks/RouteCard.astro
@@ -0,0 +1,92 @@
+---
+// RouteCard — one chapter card in the landing page's six-up route grid.
+//
+// Markup mirrors `index.html`'s `` block:
+// {number}{title}
{summary}
…
+// The `route-grid` wrapper in landing.css used to push each card's link to the
+// bottom with `display:flex; flex-direction:column; margin-top:auto` on the
+// anchor. That responsibility lives on the card itself now, so the card is
+// self-contained — drop it into any gap:1px group and it lays out the same way.
+//
+// Built from `.agents/templates/components/static-block.astro` per task 08 of
+// the Astro refactor. Steps on:
+// - number — the "01" … "06" prefix
+// - title — the chapter name (h2)
+// - summary — the lede line under the title
+// - href — link target for the chapter
+// - cta — link text (the index page varies this: "Open chapter →",
+// "Open lab →", "Open desk →"). Defaults to "Open chapter →".
+
+interface Props {
+ /** Two-digit prefix rendered in the chapter surface red, e.g. "01". */
+ number: string;
+ /** Chapter name shown as the card's h2. */
+ title: string;
+ /** One-line summary under the title. */
+ summary: string;
+ /** Link target for the chapter. */
+ href: string;
+ /** Link text. Varies per destination in the current landing page. */
+ cta?: string;
+}
+
+const { number, title, summary, href, cta = 'Open chapter →' } = Astro.props;
+---
+
+
+ {number}
+ {title}
+ {summary}
+ {cta}
+
+
+