feat: give the chapters motion, diagrams, and retrieval practice
verify-and-publish / gate (push) Successful in 7m4s
verify-and-publish / publish (push) Has been skipped

Three strands of work on the chapter surface, all reading from the same
constraint: this site ships no runtime dependencies, so every effect below
is native CSS or an .astro component.

Motion (src/styles/motion.css, DrawRule.astro). A scroll-driven layer of
reveals, hero parallax, section depth, and a hairline that paints itself
along its path, scrubbed by `animation-timeline: view()` — 0KB against
lottie-web's ~60KB gzipped on the main thread. Every scrubbed rule sits
inside `prefers-reduced-motion: no-preference` and `@supports`, so a
Firefox reader or an opted-out one gets the complete static page rather
than one with holes in it. Ranges key to `cover 40%`-`cover 75%` where the
motion is meant to be watched: `view()` ranges key to first visibility,
which on a 2600px page is long before anyone is reading the section.
`.agents/skills/motion/references/scroll-driven.md` records the technique
and the two ways `pathLength` normalisation was broken while building it.

Diagrams (StepFlow.astro, WorktreeMap.astro). The `.steps` stack on
/skills/, /models/, and /agents/ becomes a numbered flow with connectors,
and /agents/ grows the worktree map it was describing in prose — reusing
the `trees` collection rather than a second set of strings. The map's
static variant is gated one class deeper than full-guide's page styles, so
the interactive copy renders byte-identical. Connectors are pseudo-elements,
not SVG: a stretched path desynchronises its own dash pattern, and a
straight line does not need one. Mermaid was considered and rejected at
~1MB of runtime.

Retrieval practice (/rules/, /skills/). A "check yourself" section of
native `<details>` question/answer pairs plus a citation row, both bilingual
through the existing `data-copy` toggle, and both JavaScript-free.

Two audit blind spots surfaced and are closed rather than worked around:
`build.inlineStylesheets: 'never'`, because Astro inlined sheets under ~4kB
and audit-ui.mjs reads its colour and size baseline from dist/_astro/*.css;
and `--columns` declared in the grid components, because an element-level
custom property is not a declaration the audit can resolve.

legacy/styles/skills.css is renamed and imported for its side effect. Inside
a *page*, `?url` resolves to that page's own CSS chunk whatever file it
names, so the link pointed at the wrong asset and the sheet was emitted but
never loaded — the package preview had been rendering unstyled and
overflowing since the Astro cutover.

verify.mjs gains 5 assertions for the recall sections and their Portuguese
copy: 89 now, against the 84 baseline.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Marcos Paulo
2026-09-06 16:04:08 -03:00
parent ab2308441c
commit 79920c9e6c
38 changed files with 1712 additions and 133 deletions
+30
View File
@@ -170,6 +170,17 @@ if (
throw new Error('built rules page lost its accessible controls');
if (!html.rules.includes('data-rules-copy') || !html.rules.includes('"pt"'))
throw new Error('built rules page lost its Portuguese interaction data');
if (
!has(html.rules, [
'id="recall"',
'data-copy="recallQ1"',
'data-copy="recallQ2"',
'data-copy="recallQ3"',
])
)
throw new Error('built rules page lost its retrieval-practice section');
if (!html.rules.includes('Dificuldade desejável') || !html.rules.includes('"recallA2"'))
throw new Error('built rules page lost its Portuguese recall copy');
if (
!has(html.review, [
@@ -233,6 +244,25 @@ if (
])
)
throw new Error('built skills page lost its package explorer');
if (
!has(html.skills, [
'id="recall"',
'<summary',
'The skill never loads. What is the first suspect?',
'agentskills.io/specification',
'hands-on/starter/',
])
)
throw new Error('built skills page lost its recall section or citations');
if (
!has(read('src/content/chapters/skills.json'), [
'"recall"',
'"links"',
'Teste-se',
'Especificação do formato',
])
)
throw new Error('skills chapter lost its Portuguese recall copy');
if (!has(html.starter, ['id="task-list"', 'id="task-count"']))
throw new Error('starter lab lost its task-list contract');