Pipeline A does not support steps. ::::steps inside an AUP
format: "markdown" text field renders as literal text. This container is
pipeline-B only, and (362 files) the third most-used extension in a real
production corpus.
The colon-nesting rule — read this before writing a steps block
remark-directive uses colon count to decide leaf vs. container, not just fence
matching: exactly 2 colons (::name) is always a leaf directive — it can never
have a body, no matter what follows it on later lines. 3 or more colons (:::name
… :::) is a container directive — it can hold block children (paragraphs,
lists, code, even a nested admonition). step needs a body, so it must use 3
colons, never 2; the wrapping steps container then needs one more than that (4),
so its own closing fence can't be confused with an inner step's:
::::steps
:::step{title="First step"}
...
:::
::::Get the colon count on step wrong and the ENTIRE step silently disappears — not
just its body, the title too — no error, no warning. This was verified
empirically against this exact pipeline, not assumed: writing step with only 2
colons (a leaf directive, thinking "2 is probably enough") makes
content-reader.ts's stepsDirectiveToAup() skip it entirely, because a leaf
directive's parsed type (leafDirective) never matches the containerDirective
check that function requires:
::::steps
::step{title="This step silently disappears entirely"}
This text never reaches the page — no error is raised anywhere, and neither is
the title above.
::::Rendered, the container above produces an empty, item-less step list — nothing
at all, not even a placeholder. (Using the SAME colon count for both the outer
steps and the inner step, e.g. 3 and 3, does NOT lose content in this parser —
it renders the step correctly and merely leaves one stray, harmless line of literal
::: text after it. The dangerous mistake is specifically dropping step down to
2 colons, turning it into a leaf.)
The fix: anything that needs a body must use 3+ colons, never 2 — and the
wrapping container should use one more than its deepest nested container, so
card-group wrapping action-card (3 colons) uses 4, matching steps/step
above; a directive that never needs a body (like action, 2 colons) is fine as a
leaf. See Cards for the card-family example.
A working example
Source:
::::steps
:::step{title="Install the CLI"}
Run `npm install -g arc-cli` to get started.
:::
:::step{title="Configure your project"}
Create an `arc.config.json` file with your settings.
- Set your DID Space endpoint
- Set your default locale
:::
:::step{title="Deploy"}
```bash
arc space diff --server https://staging.example.com
arc space deploy --server https://staging.example.com
```
:::
::::Rendered:
Install the CLI
Run
npm install -g arc-clito get started.Configure your project
Create an
arc.config.jsonfile with your settings.- Set your DID Space endpoint
- Set your default locale
Deploy
arc space diff --server https://staging.example.com arc space deploy --server https://staging.example.com
Each step's body accepts any block content — text, a list, a code block, even a
nested admonition — via the same recursive conversion the rest of this pipeline
uses. A step with no title still renders (as an untitled numbered item); the
numbering itself comes from a native <ol>, so assistive tech announces "step N of
M" without the title needing to repeat it.