diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ff798f..9d2ebee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
Format follows [Keep a Changelog](https://keepachangelog.com/). This project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.18.1] - 2026-07-22
+
+### Changed
+
+- The deck's closing footer — the "full argument, in text" CTA, the all-presentations link, and the subordinate Sources disclosure — moved from slide 6 (close) to slide 7 (the whats-next finale), so it sits on the deck's actual last slide; the fixed-chrome padding follows it, and check-presentations pins the new location.
+
## [0.18.0] - 2026-07-22
### Added
diff --git a/pyproject.toml b/pyproject.toml
index 3ffef3a..a7f11ba 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "org"
-version = "0.18.0"
+version = "0.18.1"
description = "The AgentCulture org site — source of the web presence published to AgentCulture.org. Replaces the deleted landing-page repo. Not distributed on PyPI: the CLI stays repo-local; the deliverable is the published site."
readme = "README.md"
license = "Apache-2.0"
diff --git a/site-astro/scripts/check-presentations.mjs b/site-astro/scripts/check-presentations.mjs
index a0589d1..e58a408 100644
--- a/site-astro/scripts/check-presentations.mjs
+++ b/site-astro/scripts/check-presentations.mjs
@@ -197,6 +197,16 @@ function linksTo(html, href) {
return anchors(html).filter((anchor) => anchor.attrs.href === href);
}
+/** Count semantic Sources disclosures. Element-based rather
+ * than a raw-substring count, so Astro's scope attributes and any harmless
+ * whitespace/formatting change in the rendered markup can't cause a false
+ * failure (PR #28 review). */
+function countSourcesSummaries(html) {
+ return elements(html, "summary").filter(
+ (summary) => textContent(summary.inner) === "Sources",
+ ).length;
+}
+
function countOccurrences(html, needle) {
return (html.match(new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) ?? [])
.length;
@@ -673,6 +683,30 @@ check("deck finale: whats-next is last with the triad, separation band, no photo
finale.attrs["data-robot"] === undefined,
"finale section must carry no data-robot attribute",
);
+
+ // The deck's closing footer (article CTA, all-presentations link, the
+ // subordinate Sources disclosure) sits on the LAST slide — it moved off
+ // the close slide when the finale became slide 7.
+ const finaleArticleLinks = linksTo(finale.inner, articleRoute).length;
+ assert(
+ finaleArticleLinks === 1,
+ `the finale must carry the article CTA (${articleRoute}) exactly once; found ${finaleArticleLinks}`,
+ );
+ const finalePresentationsLinks = linksTo(finale.inner, presentationsRoute).length;
+ assert(
+ finalePresentationsLinks === 1,
+ `the finale must carry the all-presentations link (${presentationsRoute}) exactly once; found ${finalePresentationsLinks}`,
+ );
+ const finaleSources = countSourcesSummaries(finale.inner);
+ assert(
+ finaleSources === 1,
+ `the Sources disclosure must render exactly once, on the finale; found ${finaleSources} there`,
+ );
+ const deckSourcesTotal = countSourcesSummaries(deckHtml);
+ assert(
+ deckSourcesTotal === 1,
+ `the deck must render exactly one Sources disclosure, found ${deckSourcesTotal}`,
+ );
});
check("deck imagery: three robot photos with alt text", () => {
diff --git a/site-astro/src/data/mind-nervous-system-body-slides.ts b/site-astro/src/data/mind-nervous-system-body-slides.ts
index 85ce539..7e772b2 100644
--- a/site-astro/src/data/mind-nervous-system-body-slides.ts
+++ b/site-astro/src/data/mind-nervous-system-body-slides.ts
@@ -11,7 +11,8 @@
// evidence-pinned beat text stay put in `mind-nervous-system-body.ts`; this
// module still does not derive from it and carries no per-slide evidence
// ids. Sources stay subordinate: see `deckSources` below (repo homes + one
-// dated note), rendered once on the close slide, never per-slide.
+// dated note), rendered once in the deck's closing footer on the finale
+// slide, never per-slide.
//
// DECK SHAPE — exactly seven slides, one per primary beat (`beat` 1-7, in
// slide order): org#23's six plus the whats-next-finale-slide trajectory
@@ -328,7 +329,7 @@ export interface DeckSourceProject {
}
/**
- * The deck's subordinate sources note, rendered once on the close slide (not
+ * The deck's subordinate sources note, rendered once on the finale slide (not
* per-slide): repo-home links for both projects plus one dated note. This is
* the deck's evidence surface — the article keeps the strict, commit-pinned
* ledger in `presentations.ts` / `mind-nervous-system-body.ts`, untouched.
diff --git a/site-astro/src/pages/presentations/mind-nervous-system-body.astro b/site-astro/src/pages/presentations/mind-nervous-system-body.astro
index fe2f78d..5c5f08b 100644
--- a/site-astro/src/pages/presentations/mind-nervous-system-body.astro
+++ b/site-astro/src/pages/presentations/mind-nervous-system-body.astro
@@ -15,10 +15,13 @@
// 4. surfaces — the reachy-mini-action photo with three labels around it.
// 5. autonomy — a triptych of three DeckSituationVignettes (stuck,
// disconnected, routine); no photo.
-// 6. close — two dual-maturity robot cards, the verbatim thesis, sources.
+// 6. close — two dual-maturity robot cards and the verbatim thesis.
// 7. whats-next — the trajectory finale: See/Remember/Act glyph triad, two
// next-step cards (no photos, no data-robot), the shared
-// separation band, the six-sentence spoken close.
+// separation band, the six-sentence spoken close, and the
+// deck's closing footer (article CTA, all-presentations link,
+// the subordinate Sources disclosure) — it sits on the last
+// slide, so it moved off "close" when the finale landed.
//
// Navigation is progressive enhancement over natural scroll: the dot rail is
// plain anchors, the prev/next chrome and keyboard support exist only under
@@ -390,34 +393,6 @@ const slideViews = slides.map((slide, index) => {
{slide.bottomLine}
-
)}
@@ -478,6 +453,34 @@ const slideViews = slides.map((slide, index) => {
>
{slide.spokenLine}
+
)}
@@ -1041,8 +1044,9 @@ const slideViews = slides.map((slide, index) => {
color: var(--accent-strong);
}
- .slide--close {
- /* room for the fixed chrome beneath the sources on short viewports */
+ .slide--next {
+ /* room for the fixed chrome beneath the sources on short viewports —
+ the closing footer moved here when the finale became the last slide */
padding-bottom: 7rem;
}
diff --git a/uv.lock b/uv.lock
index 1740f40..4327dba 100644
--- a/uv.lock
+++ b/uv.lock
@@ -236,7 +236,7 @@ wheels = [
[[package]]
name = "org"
-version = "0.18.0"
+version = "0.18.1"
source = { editable = "." }
[package.dev-dependencies]