Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
34 changes: 34 additions & 0 deletions site-astro/scripts/check-presentations.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,16 @@ function linksTo(html, href) {
return anchors(html).filter((anchor) => anchor.attrs.href === href);
}

/** Count semantic <summary>Sources</summary> 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;
Expand Down Expand Up @@ -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}`,
);
Comment thread
OriNachum marked this conversation as resolved.
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", () => {
Expand Down
5 changes: 3 additions & 2 deletions site-astro/src/data/mind-nervous-system-body-slides.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
68 changes: 36 additions & 32 deletions site-astro/src/pages/presentations/mind-nervous-system-body.astro
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -390,34 +393,6 @@ const slideViews = slides.map((slide, index) => {
<p class="thesis-final" data-reveal style="--reveal-delay: 0.42s">
{slide.bottomLine}
</p>
<div class="close-foot" data-reveal style="--reveal-delay: 0.52s">
<div class="close-actions">
<a class="cta" href="/articles/mind-nervous-system-body/">
The full argument, in text →
</a>
<a class="cta-quiet" href="/presentations/">
All presentations
</a>
</div>
<details class="sources">
<summary>Sources</summary>
<ul>
{deckSources.projects.map((project) => (
<li>
<a
href={project.repositoryUrl}
target="_blank"
rel="noreferrer"
>
<span class="source-label">{project.label}</span>
<span class="source-meta">{project.repositoryUrl}</span>
</a>
</li>
))}
</ul>
<p class="source-note">{deckSources.note}</p>
</details>
</div>
</div>
)}

Expand Down Expand Up @@ -478,6 +453,34 @@ const slideViews = slides.map((slide, index) => {
>
{slide.spokenLine}
</p>
<div class="close-foot" data-reveal style="--reveal-delay: 0.74s">
<div class="close-actions">
<a class="cta" href="/articles/mind-nervous-system-body/">
The full argument, in text →
</a>
<a class="cta-quiet" href="/presentations/">
All presentations
</a>
</div>
<details class="sources">
<summary>Sources</summary>
<ul>
{deckSources.projects.map((project) => (
<li>
<a
href={project.repositoryUrl}
target="_blank"
rel="noreferrer"
>
<span class="source-label">{project.label}</span>
<span class="source-meta">{project.repositoryUrl}</span>
</a>
</li>
))}
</ul>
<p class="source-note">{deckSources.note}</p>
</details>
</div>
</div>
)}
</section>
Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading