diff --git a/tasks/in-progress/31-minisite-skeleton-and-build.md b/tasks/review/31-minisite-skeleton-and-build.md
similarity index 64%
rename from tasks/in-progress/31-minisite-skeleton-and-build.md
rename to tasks/review/31-minisite-skeleton-and-build.md
index f196260..2c2b892 100644
--- a/tasks/in-progress/31-minisite-skeleton-and-build.md
+++ b/tasks/review/31-minisite-skeleton-and-build.md
@@ -1,6 +1,6 @@
# 31 — Stand up site/ and generate its pages from the repo's own markdown
-**Status:** In Progress
+**Status:** Review
**Assignee:** istos
**Priority:** High — nothing else about the site can start until there is a
build and a place to put pages
@@ -106,3 +106,22 @@ installed project ("read it too", "this file"). Some sections will read
oddly in public. Where a slice cannot stand alone, the fix is to improve
`AGENTS.md` — it is read by more agents than people — not to fork the
prose into the site.
+
+
+---
+
+## Work report — 2026-07-31 11:31 (Basil)
+
+us contract.** The `from` heading is matched on its text (writing the `#`s pins the level too) and is *dropped* from the body — the layout renders the page title, so keeping it would say the name twice. What remains is promoted by `level - 1`, so a section's `###` sub-headings land as the page's `
`s and feed the article's "On this page" list. Headings inside fenced code blocks never match, which matters: AGENTS.md fences a task template whose first line is `# Task title`.
+
+- **Drift, verified end to end.** Renaming `## Claiming a card` in a scratch copy of AGENTS.md makes the build exit 1 with a message naming the route, the file and the heading, and write no page. The same holds for a renamed `to` heading, a deleted source file, and a slice that comes out empty. Every page renders before the output directory is touched, so a drifting rebuild leaves the previous good build standing rather than replacing a working site with a broken one — that is asserted too.
+
+- **Links.** Repo-relative markdown links are rewritten to GitHub blob URLs, or to a site route when `link_routes` in `pages.json` maps the file to one (empty for now; task 34 will fill it). A link to a path that does not exist, or one that escapes the repo, stops the build. Neither current source section contains a markdown link — `AGENTS.md` and `README.md` have exactly two between them, both outside the sliced ranges — so this path is covered by synthetic sources in the tests rather than by the shipped pages.
+
+- **The same-origin check, precisely.** `tests/test_site_build.py` asserts that every `` whose `rel` opens a connection (stylesheet, icon, preload, preconnect, …) and every `