diff --git a/.ciagent/PERSONAS.md b/.ciagent/PERSONAS.md
index 1bda1d1..2139fe2 100644
--- a/.ciagent/PERSONAS.md
+++ b/.ciagent/PERSONAS.md
@@ -1,32 +1,174 @@
---
project: acdl
-milestone: v1.22
+milestone: v1.23
generated_at: 2026-08-11
generator: lead-developer
verification_toolchain:
- typecheck: "python3 -m py_compile tests/test_slides_pipeline.py"
- test: "pytest tests/test_slides_pipeline.py # REQ-254..262"
- build: "bash scripts/render_slides.sh nova-autonomous-cloud-delivery # HTML + PPTX"
+ typecheck: "python3 -m py_compile scripts/inline_images.py scripts/render_pptx.py tests/test_slides_pipeline.py"
+ test: "pytest tests/test_slides_pipeline.py # REQ-263..275"
+ build: "bash scripts/render_slides.sh nova-autonomous-cloud-delivery # HTML + Marp PPTX; then python3 scripts/render_pptx.py # structured PPTX"
note: |
- v1.22 is the Nova Deck Layout Fix — a docs-only NFR milestone. Two
- active personas: lead-developer (theme CSS + deck markdown + talking
- points + README + .ciagent metadata), backend-engineer (render scripts
- + tests). frontend-engineer stays deactivated (decks are markdown =
- lead-developer territory, per v1.17/v1.18 precedent). No data-engineer
- (no schema/DB changes). No new personas (the work is CSS + bash +
- markdown + pytest, all within the two active personas' range).
+ v1.23 is the Nova Deck Cleanup & Python PPTX — a docs/render/test
+ NFR milestone. Two active personas: lead-developer (deck markdown
+ consolidation + inline Marp style CSS + README + .ciagent metadata),
+ backend-engineer (Python scripts inline_images.py + render_pptx.py
+ via python-pptx + render_slides.sh updates + tests + CI YAML +
+ attach_release_asset.py extension). frontend-engineer stays
+ deactivated (decks are markdown + Marp CSS = lead-developer
+ territory, per v1.17/v1.18/v1.22 precedent). No data-engineer (no
+ schema/DB changes). No new personas (the work splits cleanly into
+ narrative+CSS+docs and Python+bash+tests+CI).
---
-# ACDL — Persona Roster (v1.22 Nova Deck Layout Fix)
+# ACDL — Persona Roster (v1.23 Nova Deck Cleanup & Python PPTX)
-> v1.22 roster. Two active personas + one deactivated. This is a docs-
-> only NFR milestone: the work is theme CSS, render scripts, mermaid
-> diagrams, deck markdown, and tests. frontend-engineer stays
-> deactivated (decks are markdown = lead-developer territory, per
-> v1.17/v1.18 precedent). No data-engineer (no schema/DB changes).
+> v1.23 roster. Two active personas + two deactivated. This is a
+> docs/render/test NFR milestone: the work is deck markdown
+> consolidation, Marp inline `style:` CSS (reverting from the standalone
+> `nova-sp-theme.css` to `theme: default` + inline block), two Python
+> render scripts (`inline_images.py` stdlib image inlining +
+> `render_pptx.py` structured PPTX via python-pptx), test updates, CI
+> YAML, README rewrite, and the `attach_release_asset.py` extension to
+> dual-PPTX. frontend-engineer stays deactivated (Marp CSS is a static
+> stylesheet, not a React/Next.js component system — D-148 precedent).
+> No data-engineer (no schema/DB/ORM changes).
## Active personas
+### lead-developer
+- **Domain:** coordination + deck content + inline CSS
+- **Active:** true
+- **Phase-specific:** false
+- **Frameworks:** [] (no framework — owns process + narrative + Marp inline CSS + markdown + README)
+- **Constraints:** ["pragmatic", "battle-tested defaults", "no fabrication (NORTH_STAR honesty model)", "do not change the 4-beat arc", "do not re-introduce badges/version/internal citations", "port the reference deck's exact inline style CSS (the clean look)"]
+- **Territory:**
+ - `docs/presentations/nova-autonomous-cloud-delivery-marp.md` (REQ-263..275 — deck consolidation: merge plain .md into -marp.md, trim word count, remove "penetrate")
+ - `docs/presentations/nova-autonomous-cloud-delivery.md` (DELETE — consolidated into -marp.md)
+ - `docs/presentations/nova-autonomous-cloud-delivery-talking-points.md` (sync to final slide structure)
+ - `docs/presentations/README.md` (rewrite 4-step → 3-step process for single-document + dual-PPTX pipeline)
+ - `docs/presentations/assets/nova-sp-theme.css` (RETIRE from render; keep as reference file)
+ - `.ciagent/**` (PROJECT, ROADMAP, REQUIREMENTS, RESEARCH, PLAN, GRILL, PERSONAS, REVIEW, CHECKPOINT)
+- **Reason:** Owns the deck markdown consolidation (plain `.md` +
+ `-marp.md` → single `-marp.md` with speaker notes as HTML comments),
+ the inline `style:` CSS block (porting the reference deck's exact
+ CSS — the "clean look"), the word-count trim, the "penetrate"
+ removal, the talking-points sync, the README rewrite, and all
+ CIAgent metadata. Is the only persona that touches `.ciagent/**` and
+ the deck markdown/CSS. The inline `style:` block is a Marp
+ frontmatter stylesheet, not a frontend component system (D-148
+ precedent from v1.22).
+- **Phase-specific flag:** none (active for all of P0–P-final).
+
+### backend-engineer
+- **Domain:** Python render scripts + bash + tests + CI
+- **Active:** true
+- **Phase-specific:** false
+- **Frameworks:** ["python-pptx", "bash", "pytest", "marp-cli", "mermaid-cli", "base64/re/mimetypes (stdlib)"]
+- **Constraints:** ["pin CLI versions (no @latest in workflows-src/slides.yml — currently unpinned, must fix)", "python-pptx>=0.6.23 minimum", "stdlib-only for inline_images.py (no external image lib)", "tests must catch the theme-default + inline-style regression (the gap that let v1.22's standalone-theme drift through)", "no raw curl with shell-env tokens"]
+- **Territory:**
+ - `scripts/inline_images.py` (NEW — stdlib base64 image inlining into rendered HTML)
+ - `scripts/render_pptx.py` (NEW — structured editable PPTX via python-pptx)
+ - `scripts/render_slides.sh` (update: drop --theme nova-sp-theme.css; add inline_images.py + render_pptx.py invocations)
+ - `scripts/attach_release_asset.py` (extend to accept multiple file paths: both .pptx + -python.pptx)
+ - `tests/test_slides_pipeline.py` (REQ-262 successor — invert theme tests, retarget CSS tests to inline style block, delete source-md tests, update slide count)
+ - `workflows-src/slides.yml` (add python-pptx install step; pin @latest → @4.5.0/@11.16.0; add -python.pptx to commit list)
+ - `pyproject.toml` (add python-pptx>=0.6.23 to [project.optional-dependencies] test)
+- **Reason:** Owns the Python render scripts (`inline_images.py` is
+ stdlib regex + base64; `render_pptx.py` is python-pptx — a backend
+ Python library, not a frontend framework). The render_slides.sh
+ updates (drop `--theme`, add the two Python script invocations) and
+ the CI YAML (add python-pptx install, pin versions, add
+ -python.pptx to commit list) are backend/scripting tasks. The test
+ suite updates (invert the theme-default test, retarget CSS tests to
+ the inline `style:` block, delete the source-md tests) are the gap
+ that let v1.22's standalone-theme drift through — backend-engineer
+ owns closing it. python-pptx is new to v1.23; backend-engineer's
+ frameworks list gains it.
+- **Phase-specific flag:** none (active for P2 scripts, P5 tests; light
+ touch on P0/P-final).
+
+## Deactivated personas
+
+### frontend-engineer
+- **Active:** false
+- **Domain:** frontend
+- **Frameworks:** ["react", "next.js"] (inert — no territory)
+- **Constraints:** ["component-first", "server-components", "minimal-client-js"] (inert)
+- **Territory:** [] (no territory in v1.23)
+- **Reason:** v1.23 has no frontend; decks are markdown + Marp inline
+ CSS (lead-developer territory); deactivated per PERSONAS.md
+ v1.17/v1.18/v1.22 precedent. The inline `style:` block is a Marp
+ frontmatter stylesheet (CSS rules in the markdown frontmatter), not
+ a React/Next.js component system — it stays lead-developer
+ territory. No reactivation trigger.
+
+### data-engineer
+- **Active:** false
+- **Domain:** data
+- **Frameworks:** [] (inert)
+- **Constraints:** [] (inert)
+- **Territory:** [] (no territory in v1.23)
+- **Reason:** v1.23 has no schema/DB/ORM changes. The milestone is
+ docs + Python scripts + bash + tests + CI only. No reactivation
+ trigger.
+
+## Roster decisions
+
+### D-163 (0.95): Inline Marp `style:` block is lead-developer territory, not frontend-engineer
+The inline `style:` block in the Marp frontmatter is a static CSS
+stylesheet (a block of CSS rules in the markdown frontmatter, applied
+by Marp to the rendered slides), not a React/Next.js component system.
+The v1.17/v1.18/v1.22 precedent (decks are markdown = lead-developer
+territory; the theme CSS is a Marp stylesheet, not a frontend framework
+— D-148) extends to the inline `style:` block. frontend-engineer's
+frameworks (react, next.js) are irrelevant to Marp frontmatter CSS.
+**Decision:** inline `style:` block stays lead-developer territory.
+Confidence 0.95 — the only counter-argument is that CSS is "frontend,"
+but Marp frontmatter CSS is a static stylesheet authored in the
+markdown source, not a component system.
+
+### D-164 (0.90): No new personas for v1.23
+The work is markdown + inline CSS + Python scripts + bash + tests + CI
+YAML + README. All of this is within the two active personas' range
+(lead-developer: markdown + CSS + README + metadata; backend-engineer:
+Python + bash + tests + CI). Creating a separate "slides-engineer" or
+"pptx-engineer" persona would fragment ownership of the deck markdown
+(lead) and the render scripts (backend). The python-pptx work is
+unambiguously backend (a Python library + script), even though the
+slide layout decisions within `render_pptx.py` are co-owned with lead-
+developer. **Decision:** no new personas. Confidence 0.90 — follows
+v1.22 D-149 precedent.
+
+### Territory-overlap resolution (co-ownership)
+
+| Path | Primary | Co-owner | Why |
+|------|---------|----------|-----|
+| `scripts/render_pptx.py` | backend-engineer (Python code + python-pptx API) | lead-developer (slide layout decisions: which image where, font sizes, bullet structure) | The script is backend (Python); the slide-by-slide layout decisions within it are design decisions that reflect lead-developer's deck ownership. `warn` enforcement — cross-territory edits logged, not blocked. |
+| `scripts/render_slides.sh` | backend-engineer (bash script) | lead-developer (the inline `style:` block content it renders) | The script is backend; the CSS it renders is lead-developer's. |
+| `tests/test_slides_pipeline.py` | backend-engineer (test code) | lead-developer (assertions reflect deck structure + inline CSS) | The test code is backend; the assertions (slide count, inline style rules, theme-default) reflect lead-developer's deck/CSS decisions. |
+| `docs/presentations/README.md` | lead-developer (process narrative) | backend-engineer (build commands + render script invocations) | The process narrative is lead; the build commands + script names are backend. |
+
+## Domain priority (v1.23)
+
+`lead-developer → backend-engineer`
+
+Rationale: the deck markdown consolidation + inline CSS (lead) is the
+binding constraint — the render scripts (backend) can't be finalized
+until the deck structure is stable (slide count, inline style). The
+inline `style:` block must be ported + verified before the render
+pipeline (HTML + PPTX) is re-run. Backend (scripts + tests + CI)
+follows once the deck + CSS are settled. The dual-PPTX pipeline is
+wired last, once the deck renders clean with the inline style.
+
+---
+
+## Historical rosters
+
+
+v1.22 roster (Nova Deck Layout Fix) — superseded by v1.23
+
+### Active personas (v1.22)
+
### lead-developer
- **Domain:** coordination + deck content
- **Active:** true
@@ -65,61 +207,13 @@ verification_toolchain:
backend/scripting tasks.
- **Phase-specific flag:** none (active for P2, P5; light touch on P0/P6).
-## Deactivated personas
+### D-148 (v1.22): Theme CSS is lead-developer territory, not frontend-engineer
+### D-149 (v1.22): No new personas for v1.22
-### frontend-engineer
-- **Active:** false
-- **Domain:** frontend
-- **Frameworks:** ["react", "next.js"] (inert — no territory)
-- **Constraints:** ["component-first", "server-components", "minimal-client-js"] (inert)
-- **Territory:** [] (no territory in v1.22)
-- **Reason:** v1.22 has no frontend; decks are markdown (lead-developer
- territory); deactivated per PERSONAS.md v1.17/v1.18 precedent. The
- theme CSS is a Marp stylesheet, not a React/Next.js component system
- — it stays lead-developer territory. No reactivation trigger.
-
-### data-engineer
-- **Active:** false
-- **Domain:** data
-- **Frameworks:** [] (inert)
-- **Constraints:** [] (inert)
-- **Territory:** [] (no territory in v1.22)
-- **Reason:** v1.22 has no schema/DB/ORM changes. The milestone is
- docs + scripts + tests only. No reactivation trigger.
-
-## Roster decisions
-
-### D-148 (0.95): Theme CSS is lead-developer territory, not frontend-engineer
-The `nova-sp-theme.css` is a Marp stylesheet (CSS for a markdown-to-
-slide renderer), not a React/Next.js component system. The v1.17/v1.18
-precedent (decks are markdown = lead-developer territory) extends to
-the deck's CSS theme. frontend-engineer's frameworks (react, next.js)
-are irrelevant to Marp CSS. **Decision:** theme CSS stays lead-developer
-territory. Confidence 0.95 — the only counter-argument is that CSS is
-"frontend," but Marp CSS is a static stylesheet, not a component system.
-
-### D-149 (0.9): No new personas for v1.22
-The work is CSS + bash + markdown + mermaid + pytest. All of this is
-within the two active personas' range (lead-developer: CSS + markdown +
-mermaid; backend-engineer: bash + pytest). Creating a separate "css-
-engineer" or "slides-engineer" persona would fragment ownership of the
-theme CSS + deck markdown (both lead-developer) and the render scripts
-+ tests (both backend-engineer). **Decision:** no new personas.
-Confidence 0.9.
-
-### Territory-overlap resolution (co-ownership)
-
-| Path | Primary | Co-owner | Why |
-|------|---------|----------|-----|
-| `docs/presentations/assets/mmd/*.mmd` | lead-developer (mermaid re-layout) | backend-engineer (re-render via render_slides.sh) | The .mmd content is lead-developer (diagram narrative); the PNG re-render is backend-engineer (script invocation). |
-| `tests/test_slides_pipeline.py` | backend-engineer (test code) | lead-developer (assertions reflect deck structure) | The test code is backend; the assertions (slide count, theme rules, aspect ratios) reflect lead-developer's deck/theme decisions. |
-
----
-
-## Historical rosters
+
-v1.18 roster (Citizen Developer & Production-Grade Guidance) — superseded by v1.22
+v1.18 roster (Citizen Developer & Production-Grade Guidance) — superseded
### Active personas (v1.18)
@@ -139,94 +233,32 @@ Confidence 0.9.
- `docs/scope.md` (REQ-216)
- `docs/skills.md` (REQ-222 — the index page, not the skill files themselves)
- `docs/submission-readiness.md` (REQ-219 — citizen-developer-facing copy; co-owned with backend-engineer for the reason-code catalog)
-- **Reason:** Owns CIAgent metadata, the milestone narrative, the RACI +
- PDLC-scope statements (REQ-215/216), the deck (21 slides, S&P theme
- regression check vs P1, CAP-024), the skills index page (REQ-222), and
- the citizen-developer-facing submission-readiness doc (REQ-219). Is
- the only persona that touches `.ciagent/**` and the deck markdown.
-- **Phase-specific flag:** none (active for all of P0–P7).
### backend-engineer
- **Domain:** backend
- **Active:** true
- **Phase-specific:** false
- **Frameworks:** ["mcp (Python SDK v2)", "pydantic", "jsonschema", "urllib"]
-- **Constraints:** ["api-first", "strict-typing", "plugin-registry extensible (D-140)", "stdio now / HTTP-ready (D-135)", "no stack traces to citizen developers (REQ-218)"]
- **Territory:**
- `mcp/atelier/server.py` (REQ-223)
- `mcp/atelier/plugins/**/*.py` (REQ-223 — principles.py, validation.py)
- `mcp/atelier/vendor/**` (REQ-224 — vendored Atelier snapshot)
- `mcp/atelier/VERSION.md` + `mcp/atelier/README.md` (REQ-224)
- `scripts/update_atelier_vendor.sh` (REQ-224)
- - `core/submission_readiness.py` (REQ-218 — the validator, invoked as `contract_ingestor.py --check-readiness`)
- - `scripts/render_deck.sh` (REQ-228 — HTML + PPTX render)
- - `scripts/attach_release_asset.py` (REQ-228 — Gitea release asset upload)
+ - `core/submission_readiness.py` (REQ-218)
+ - `scripts/render_deck.sh` (REQ-228)
+ - `scripts/attach_release_asset.py` (REQ-228)
- `tests/test_atelier_mcp.py` (REQ-225)
- `tests/test_submission_readiness.py` (REQ-220)
- - `docs/submission-readiness.md` (REQ-219 — reason-code catalog section; co-owned with lead-developer for the narrative)
-- **Reason:** Owns the MCP server (plugin-registry, stdio, vendored
- Atelier), the submission-readiness validator (extends
- `contract_ingestor.py --check-readiness`, D-133), the render/attach
- scripts (D-142 trigger), and the two new test files. The MCP
- plugin-registry (D-140) is a backend pattern — no separate
- mcp-engineer persona is created; backend-engineer owns it.
-- **Phase-specific flag:** none (active for P1 deck-render, P3 validator,
- P5 MCP server, P6 scripts).
### data-engineer
- **Domain:** data
- **Active:** true
-- **Phase-specific:** false
- **Frameworks:** ["jsonschema", "dynamodb (item shape)"]
-- **Constraints:** ["schema-first", "superset-gate NOT duplicate (PROJECT.md hard constraint)", "W3.E per-env mandatory table is the source of truth"]
- **Territory:**
- - `schemas/**` (REQ-217 — `submission-readiness.schema.json` is the new schema; existing schemas untouched)
- - `core/lambda/contract_ingestor.py` (the `--check-readiness` subcommand wiring, D-133 — the validator is in `core/submission_readiness.py` but the ingestor dispatches to it; co-owned with backend-engineer)
-- **Reason:** Owns the submission-readiness JSON Schema (REQ-217) — it
- is a schema artifact, data-engineer territory. The schema is a
- *superset gate above* `contract.schema.json`, not a duplicate (it
- references contract fields, does not redefine them). The
- per-env-mandatory table comes from W3.E (the locked decision). The
- ingestor wiring is co-owned with backend-engineer (the dispatch point
- is backend; the schema it validates against is data).
-- **Phase-specific flag:** none (active for P3 schema + ingestor wiring).
+ - `schemas/**` (REQ-217)
+ - `core/lambda/contract_ingestor.py` (co-owned with backend-engineer)
-### Deactivated personas (v1.18)
-
-### frontend-engineer
-- **Active:** false
-- **Domain:** frontend
-- **Frameworks:** ["react", "next.js"] (inert — no territory)
-- **Constraints:** ["component-first", "server-components", "minimal-client-js"] (inert)
-- **Territory:** [] (no territory in v1.18)
-- **Reason:** v1.18 has no frontend; decks are markdown (lead-developer
- territory); deactivated per PERSONAS.md v1.17 precedent. v1.18's
- observability stays PowerBI / external (Out of Scope: "A Nova-built
- frontend / dashboard"). The MCP server exposes tools to an AI agent,
- not a web UI. No reactivation trigger in this milestone.
-
-### Roster decisions (v1.18)
-
-### D-143 (0.90): Fold mcp-engineer into backend-engineer
-The MCP plugin-registry (D-140: `plugins/.py register(mcp)`) is a
-backend code pattern — Python modules, type hints, stdio transport,
-urllib for the Gitea asset API. It shares nothing with the data domain
-(schemas/DynamoDB) and is not a new engineering discipline. Creating a
-separate `mcp-engineer` persona would fragment ownership of the server +
-its tests + the render/attach scripts (all backend). **Decision:** fold
-into backend-engineer. backend-engineer's `frameworks` list gains
-`mcp (Python SDK v2)`. Confidence 0.90 — the only counter-argument is
-that MCP is a distinct protocol skill, but the SDK v2 API surface
-(`@mcp.tool()` + type hints) is small and well within backend-engineer's
-range (it's the same Pydantic/FastAPI-style pattern the persona already
-knows).
-
-### Territory-overlap resolution (v1.18)
-
-| Path | Primary | Co-owner | Why |
-|------|---------|----------|-----|
-| `docs/submission-readiness.md` | lead-developer (narrative + examples) | backend-engineer (reason-code catalog, REQ-218 codes) | The doc is citizen-developer-facing copy (lead) but the reason-code catalog (MISSING_TAGS, ENV_MISSING_MANDATORY, AGENTIC_MISSING_INTENT, MISSING_APP_SOURCE, POLICY_PRECONDITION_MISSING) is backend (it mirrors the validator's return codes). |
-| `core/lambda/contract_ingestor.py` | backend-engineer (dispatch wiring) | data-engineer (the schema it validates against) | D-133 places the `--check-readiness` subcommand on the ingestor (backend dispatch), but the readiness schema it loads is data-engineer territory. |
-| `schemas/submission-readiness.schema.json` | data-engineer (schema artifact) | backend-engineer (the validator must match it) | The schema is data-engineer's; the validator (REQ-218) is backend-engineer's and must stay in sync with it. |
+### D-143 (v1.18): Fold mcp-engineer into backend-engineer
\ No newline at end of file
diff --git a/.ciagent/RESEARCH.md b/.ciagent/RESEARCH.md
index 661deaa..bc8433a 100644
--- a/.ciagent/RESEARCH.md
+++ b/.ciagent/RESEARCH.md
@@ -2568,3 +2568,705 @@ All 5 CLARIFY decisions are grounded in these findings:
- Re-layout to LR (FINDING 3 — TB produced 0.63 aspect)
- Delete render_deck.sh (FINDING 5 — stale, unthemed)
- Split slides 3+8 (FINDING 2 — densest overflow)
+
+---
+
+## v1.23 RESEARCH — Nova Deck Cleanup & Python PPTX
+
+> Phase: 0 RESEARCH. Milestone v1.23 (Nova Deck Cleanup & Python PPTX).
+> docs/render/test NFR milestone. Surface: deck markdown, Marp inline
+> style CSS, Python render scripts, tests, CI YAML, README.
+> Researcher: ci-researcher. Sources: ACDL codebase (v1.22 tree) +
+> the deleted clean reference HTML at /root/gl/acdl/docs/presentations/
+> the-developer-experience.html + python-pptx docs + Marp rendered HTML
+> inspection.
+
+### FINDING 1 — Marp `default` theme + inline `style:` block (the clean reference)
+
+The deleted clean reference deck
+`/root/gl/acdl/docs/presentations/the-developer-experience.html`
+(commit eb43e08) used `theme: default` + an inline `style:` block in the
+Marp frontmatter. The exact inline CSS (extracted from the `data-style`
+attribute repeated on every `` in the rendered HTML) is:
+
+```css
+section {
+ font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;
+ font-size: 26px;
+ color: #1B1B1B;
+}
+h1 { color: #D6002A; font-size: 40px; margin-bottom: 0.3em; }
+h2 { color: #D6002A; font-size: 32px; margin-bottom: 0.2em; }
+section.title { background: #1B1B1B; color: #fff; border-top: 8px solid #D6002A; }
+section.title h1 { color: #fff; }
+table { font-size: 22px; width: 100%; }
+th { background: #F0F0F0; }
+blockquote { border-left: 4px solid #D6002A; color: #2E2E2E; font-size: 24px; }
+pre { font-size: 16px; line-height: 1.3; }
+code { font-size: 16px; }
+img { display: block; margin: 0 auto; max-height: 280px; }
+.badge {
+ display: inline-block; padding: 2px 8px; border-radius: 4px;
+ font-size: 16px; font-weight: 600;
+}
+.planned { background: #fef3c7; color: #78350f; }
+```
+
+**What Marp's built-in `default` theme provides for free** (from the
+embedded `@theme default` CSS in the reference HTML):
+- `section { width:1280px; height:720px; box-sizing:border-box; overflow:hidden; position:relative }`
+ — slide dimensions + box model.
+- Base section typography: `font-family: var(--fontStack-sansSerif)`
+ (system sans), `font-size: 16px`, `line-height: 1.5`, `color:
+ var(--fgColor-default)`, `background: var(--bgColor-default)` (white).
+ **Note: default does NOT set padding** — wait, correction: the
+ `default` theme's embedded CSS in this Marp version does NOT include
+ an explicit `padding` on `section`; the nova-sp-theme.css comment
+ claiming `padding: 56px 64px` was for a different Marp version. The
+ inline `style:` block above does not set padding either, implying the
+ default theme's inheriting UA stylesheet padding or Marp's container
+ provides it. **This is the key thing to verify in P2:** whether
+ `theme: default` + the inline `style:` block produces padding that
+ reserves header/footer chrome space. The v1.22 root-cause was ZERO
+ padding with the standalone theme; the inline `style:` block above
+ also does not set padding, so the clean look may have relied on the
+ default theme's own padding (which Marp's default theme CSS
+ *does* set: `section{padding:56px 64px}` is in the default theme's
+ canonical CSS even if not visible in this rendered HTML's inlined
+ subset — the rendered HTML strips the theme CSS into a `