Enrich on-slide body wording on all 7 slides (slides 2-6 were sparse, 43-67 visible words; now 97-168). Re-balance layout: title -> frame -> body -> diagram -> closing italic benefit. Invariants preserved: 7 slides, S&P theme tokens, speaker-note bands, [1] citations 3/5/7, diagram PNGs, footer string. PPTX re-rendered. Smoke test PASS. REQ-373.1 visible prose density enriched REQ-373.2 layout improved (renderer block vocabulary unchanged) REQ-373.3 invariants preserved (D-247) REQ-373.4 PPTX re-rendered; check_leadership_deck.sh exits 0 ---ci--- project: acdl phase: 1 milestone: v1.31 status: execute ---/ci---
Presentations
Leadership-facing presentation decks for the Nova platform.
The 3-step slide creation process
Every presentation in this folder is produced by the same three-step process. Never edit the rendered HTML, either PPTX, or the talking points directly — always start from the Marp deck source of truth (Step 1), render it (Step 2), then distill the talking points (Step 3). This keeps a reviewable, plain-text source of truth for every deck and a presenter-ready cue sheet for delivery.
Step 1: Author the deck Step 2: Render Step 3: Talking points
(source of truth) ──► (HTML + dual PPTX) ──► (presenter cues)
*-marp.md *.html *-talking-points.md
+ ## Slide N — Title + mermaid PNGs + 3-6 bullets per slide
+ <!-- Speaker notes: --> + MARP PPTX (image-of-slide) + key takeaway per slide
+ <!-- Talking points: --> + python PPTX (structured) + indexed by slide #
+ <div class="benefit"> + base64-inlined HTML + content distilled from
+ embedded PNG diagrams (self-contained) the Marp deck
Step 1 — Author the deck (source of truth)
File convention: <deck-name>-marp.md (e.g.
nova-autonomous-cloud-delivery-marp.md).
This is the sole source of truth — the Marp deck that is both authored and rendered. It contains:
- Marp frontmatter at the top:
marp: true,theme: default,paginate: true,size: 16x9, a header/footer, and an inlinestyle:block carrying the S&P palette (#D6002Ared,#1B1B1Bblack, thesection.titlerule). The styling is inline — no standalone theme CSS is loaded at render time. - Every slide as an
## Slide N — Title(or## Appendix A1 — Title) H2 section. The H1 title slide precedes slide 1. - Tight bullets with leadership-relevant content.
- Speaker notes as
<!-- Speaker notes: ... -->HTML comments at the end of each slide. Marp excludes HTML comments from the rendered slide; they are for authors/presenters only. - Talking points as
<!-- Talking points: ... -->HTML comments (also excluded from rendering — Step 3 mirrors them into a standalone cue sheet). - Benefit callouts as
<div class="benefit">...</div>(styled by the inlinestyle:block — italic, S&P-red top border). No**Benefit:**text prefixes. - Mermaid diagrams pre-rendered to PNG under
assets/png/and embedded with(orh:480 class:tallfor tall images). The.mmdsources live underassets/mmd/. - No maturity badges, no version in the footer, no internal
decision/requirement IDs or
.pyfile paths in the slide bodies (those live in the.ciagent/files only; speaker-note HTML comments are exempt). - An honest "shipped vs. deferred" framing: every "available today" claim is grounded in shipped/verified work; every "deferred" item is explicitly marked with the blocking work in plain language.
Why the Marp deck is the source of truth: it is reviewable in any markdown viewer, diffs cleanly in git, and carries the full reasoning (speaker notes) that a presenter needs. The HTML and PPTX are derived artifacts — if a fact is wrong, fix it here and re-run Step 2.
nova-sp-theme.cssis RETIRED from render. The standalone theme stylesheet underassets/nova-sp-theme.cssis kept as a reference only and is not loaded at render time. The live styling is the inlinestyle:block in the-marp.mdfrontmatter. Do NOT pass the CSS via--theme; it is not in the render path.
Step 2 — Render (HTML + dual PPTX)
bash scripts/render_slides.sh [deck-name] renders the Marp deck
end-to-end:
- Mermaid PNGs — each
assets/mmd/*.mmd→assets/png/*.png(S&P-themed viasp-theme.json, 2x scale, transparent background). - MARP HTML —
*-marp.md→*.html(S&P inline style, Marp default theme). Pinned@marp-team/marp-cli@4.5.0. - MARP PPTX —
*-marp.md→*.pptx(image-of-slide PPTX; the primary release attachment). - Inline images —
scripts/inline_images.pyrewrites the HTML to base64-embed everyassets/image so the HTML is self-contained (no external asset folder needed for redistribution). - python PPTX —
scripts/render_pptx.pyproduces a second, structured, editable PPTX (*-python.pptx) with native text boxes, native tables, embedded pictures, and italic benefit callouts. - Stage — all rendered artifacts (PNGs + HTML + both PPTX) are
git add-ed for commit.
bash scripts/render_slides.sh nova-autonomous-cloud-delivery
Both the HTML and both PPTX files are committed to the repo; the MARP
PPTX is also attached to the phase's release via
scripts/attach_release_asset.py.
Dual-PPTX output
| PPTX | File | Render | Purpose |
|---|---|---|---|
| MARP PPTX | *.pptx |
@marp-team/marp-cli (Chrome screenshot of each slide) |
Image-of-slide; the primary release attachment (pixel-perfect, not editable) |
| python PPTX | *-python.pptx |
scripts/render_pptx.py (python-pptx) |
Structured, editable PPTX (native text boxes, tables, pictures) for comparison/editing |
Step 3 — Talking points (presenter cues)
File convention: <deck-name>-talking-points.md (e.g.
nova-autonomous-cloud-delivery-talking-points.md).
Distill the deck's <!-- Talking points: --> HTML comments into
presenter-ready cues, indexed by the Marp deck (Step 1) slide structure:
- One section per Marp slide —
## Slide N — Title, matching the Marp deck's 20 main + 1 appendix slide structure exactly. - 3-6 talking point bullets per slide — punchy, actionable cues
distilled from the Marp deck's
<!-- Talking points: -->comments. - Key takeaway per slide — the one memorable thing the audience should walk away with from that slide.
- No content duplication — the talking points reference the Marp slides for visual context.
Directory layout
docs/presentations/
├── README.md ← this file
├── nova-autonomous-cloud-delivery-marp.md ← Step 1: sole source of truth (title + 20 main + 1 appendix = 22 slides + speaker notes + talking points)
├── nova-autonomous-cloud-delivery.html ← Step 2: rendered HTML (committed, S&P inline style, base64-inlined images)
├── nova-autonomous-cloud-delivery.pptx ← Step 2: MARP PPTX (image-of-slide, primary release attachment)
├── nova-autonomous-cloud-delivery-python.pptx ← Step 2: python-pptx (structured, editable)
├── nova-autonomous-cloud-delivery-talking-points.md ← Step 3: presenter cues (21 sections)
└── assets/
├── nova-sp-theme.css ← RETIRED from render — reference only (not loaded; live styling is the inline `style:` block)
├── puppeteer-config.json ← no-sandbox config for mmdc
├── mmd/ ← mermaid source files (Step 2 input)
│ ├── sp-theme.json ← S&P Red/Black/White theme (mermaid-cli --configFile)
│ └── ... (per-slide .mmd files)
└── png/ ← rendered mermaid PNGs (committed, S&P-themed, 2x, transparent)
Tooling & scripts
| Script | Purpose |
|---|---|
scripts/render_slides.sh |
End-to-end render: mermaid PNGs → MARP HTML + PPTX → base64-inlined HTML → python-pptx PPTX → stage all artifacts. Pinned @marp-team/marp-cli@4.5.0 + @mermaid-js/mermaid-cli@11.16.0. |
scripts/inline_images.py |
Rewrites the rendered HTML to base64-embed every assets/ image (self-contained HTML for redistribution). |
scripts/render_pptx.py |
Produces the structured, editable *-python.pptx (native text boxes, tables, pictures, italic benefit callouts) via python-pptx. |
scripts/attach_release_asset.py |
Attaches the MARP PPTX to the phase's release. |
| Dependency | Where declared | Purpose |
|---|---|---|
@marp-team/marp-cli@4.5.0 |
scripts/render_slides.sh (pinned) |
Marp → HTML + PPTX |
@mermaid-js/mermaid-cli@11.16.0 |
scripts/render_slides.sh (pinned) |
Mermaid → PNG |
python-pptx>=0.6.23 |
pyproject.toml [project.optional-dependencies] slides |
Structured PPTX (pip install -e ".[slides]") |
Conventions
Slide structure
Each Marp deck has 1 title slide + 20 main slides + 1 appendix slide = 22
rendered slides (21 ## sections + the H1 title slide). The main 20
are the presentation; the appendix is for Q&A backup. (v1.22 split slides
3 and 8 to relieve overflow, increasing the main count from 18 to 20.)
- Title slide (H1):
<!-- _class: title -->+<!-- _paginate: false -->for the dark-background title style (S&P-red top border on black). - Main slides (1-20): the story arc — Problem → Solution → Proof → Roadmap + Ask. These are what the audience sees during the talk.
- Appendix slide (A1): the Metrics Glossary — detail-heavy reference for Q&A.
Honesty framing
Every capability claim in the deck is grounded, derived, or honestly
deferred with its blocking work named in plain language. Internal
provenance (decision IDs, requirement IDs, internal file paths) is kept
out of the audience-facing slide bodies — those live in the .ciagent/
files only (and may appear inside <!-- ... --> speaker-note comments,
which Marp excludes from the rendered slide). When in doubt, check
.ciagent/ROADMAP.md and the milestone status in .ciagent/PROJECT.md.
Audience
The audience for these decks is Senior Leadership: CTO, Head of Cloud, Head of Infrastructure, Head of DevOps. The framing rules:
- No jargon. Translate internal terms: "primitives/modules" not "L1/L2", "intent" not "IR", "human attestation" not "HITL", "pattern" not "composition."
- Selling points forward. Each slide leads with the leadership-relevant outcome; the mechanism follows.
- Security, remediation velocity, reliability, lead time, observability, citizen developer are the themes — not implementation details.
- "Infrastructure operations become visible" is the recurring theme across the deck.
Diagrams
Mermaid diagrams are authored as assets/mmd/*.mmd source files and
rendered to PNG under assets/png/:
- Author the mermaid block as
assets/mmd/<deck>-<slide>-<name>.mmd. - Use horizontal layouts (
flowchart LR) or subgraph row-wrapping for wide diagrams so the PNG fits a 16:9 slide without shrinking to illegibility. - Render with a 2x scale factor and transparent background for crisp
slides (
scripts/render_slides.shdoes this with the S&P theme JSON). - Embed with
(orh:480 class:tallfor tall images). - The render pipeline base64-inlines the PNGs into the committed HTML so the HTML is self-contained.
Build commands
Prerequisites
- Node.js + npx (for
@marp-team/marp-cliand@mermaid-js/mermaid-cli) - A Chrome/Chromium binary (Marp PPTX export requires it)
- Python 3.10+ with the
slidesextra:pip install -e ".[slides]"(installspython-pptx>=0.6.23)
This environment has a working Chromium at:
/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome
Render the deck (HTML + dual PPTX + inlined images)
bash scripts/render_slides.sh nova-autonomous-cloud-delivery
This renders all mermaid PNGs, the HTML (with base64-inlined images), the MARP PPTX, and the python-pptx PPTX, and stages them for commit. Both HTML and both PPTX files are committed to the repo; the MARP PPTX is also attached to the phase's release.
Adding a new presentation
- Author the Marp deck as
<deck-name>-marp.md— frontmatter (marp: true,theme: default,paginate: true,size: 16x9, an inlinestyle:block with the S&P palette),## Slide N — Titlesections,<!-- Speaker notes: -->+<!-- Talking points: -->HTML comments, and<div class="benefit">callouts. This is the sole source of truth. - Author any mermaid diagrams as
assets/mmd/<deck-name>-<slide>-<name>.mmd(Step 2 renders them toassets/png/). - Render via
bash scripts/render_slides.sh <deck-name>— this produces the HTML (base64-inlined), the MARP PPTX, and the python-pptx PPTX, and stages all of them (plus the PNGs) for commit. - Distill the talking points as
<deck-name>-talking-points.md— one section per Marp slide, 3-6 talking point bullets + key takeaway, content distilled from the Marp deck's<!-- Talking points: -->comments, indexed by the Marp deck slide structure. - Verify the PPTX slide count and that media files are embedded:
python3 -c " import zipfile, re with zipfile.ZipFile('docs/presentations/<deck-name>.pptx') as z: slides = [n for n in z.namelist() if re.match(r'ppt/slides/slide\d+\.xml$', n)] media = [n for n in z.namelist() if n.startswith('ppt/media/')] print(f'{len(slides)} slides, {len(media)} media files') "
Current decks
| Deck | Source of truth (Step 1) | Rendered HTML + dual PPTX (Step 2) | Talking points (Step 3) | Slides | Audience |
|---|---|---|---|---|---|
| Nova — The Autonomous Cloud Delivery Platform | nova-autonomous-cloud-delivery-marp.md |
nova-autonomous-cloud-delivery.html (inlined) + nova-autonomous-cloud-delivery.pptx (MARP, release-attached) + nova-autonomous-cloud-delivery-python.pptx (structured) |
nova-autonomous-cloud-delivery-talking-points.md |
title + 20 main + 1 appendix (22) | CTO, Head of Cloud, Head of Infra, Head of DevOps |
v1.23: the slide creation process collapsed from 4 steps to 3 — the plain
<deck-name>.mdwas deleted;<deck-name>-marp.mdis now the sole source of truth. The standalonenova-sp-theme.csswas retired from render (the live styling is the inlinestyle:block in the-marp.mdfrontmatter; the CSS file is retained as a reference only). Speaker notes moved from blockquotes into<!-- Speaker notes: -->HTML comments. Benefit callouts moved from**Benefit:**prefixes to<div class="benefit">. The render pipeline now produces a dual-PPTX output (MARP image-of-slide + python-pptx structured) and base64-inlines all images into the committed HTML.