docs(P00): research findings — v1.22 deck layout root cause (REQ-254..262)
8 findings (all confidence >= 0.8): - F1 (VERY HIGH): theme CSS has zero section padding (/* @theme */ is a comment, not the directive; no @import of Marp default). - F2 (VERY HIGH): overflow:hidden silently clips dense content (8/19 slides overflow). - F3 (HIGH): image aspect-ratio catastrophe (platform-pipeline 13.52x, telemetry-live-ops 0.63x). - F4 (HIGH): header+footer chrome on every slide (~70px lost). - F5 (MEDIUM-HIGH): render_deck.sh omits --theme (unthemed output). - F6 (HIGH): render_slides.sh missing -s 2 -b transparent (1x PNGs). - F7 (LOW): P5 marp-cli version bump — NOT the cause (theme CSS byte- identical P3->P5). - F8 (VERY HIGH): test coverage gaps — no layout/overflow/aspect-ratio tests; static-file-property tests only. Persona roster (v1.22): lead-developer (theme CSS + deck markdown + mermaid + .ciagent), backend-engineer (render scripts + tests). frontend-engineer + data-engineer deactivated. D-148 (theme CSS is lead-developer, not frontend), D-149 (no new personas). ---ci--- project: acdl phase: 0 milestone: v1.22 status: research ---/ci---
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"phase": 0,
|
"phase": 0,
|
||||||
"stage": "specify",
|
"stage": "clarify",
|
||||||
"milestone": "v1.22",
|
"milestone": "v1.22",
|
||||||
"phase_role": "pre_execution",
|
"phase_role": "pre_execution",
|
||||||
"attempts": 0,
|
"attempts": 0,
|
||||||
"updated_at": "2026-08-11T14:30:00Z",
|
"updated_at": "2026-08-11T14:32:00Z",
|
||||||
"milestone_complete": false,
|
"milestone_complete": false,
|
||||||
"tag": null,
|
"tag": null,
|
||||||
"requirements": ["REQ-254","REQ-255","REQ-256","REQ-257","REQ-258","REQ-259","REQ-260","REQ-261","REQ-262"],
|
"requirements": ["REQ-254","REQ-255","REQ-256","REQ-257","REQ-258","REQ-259","REQ-260","REQ-261","REQ-262"],
|
||||||
"notes": "v1.22 Nova Deck Layout Fix. SPECIFY complete. 9 requirements (REQ-254..262). NFR milestone, 7 phases (P0 + P1-P5 + P6 final). Tags on v1.21.x line. Root cause: theme CSS zero section padding + overflow:hidden + blunt img max-height + extreme aspect-ratio diagrams. Comprehensive fix across theme CSS, render scripts, mermaid, deck content, tests."
|
"notes": "v1.22 CLARIFY complete. 5 ambiguities auto-resolved at full autonomy (comprehensive scope, full pipeline, re-layout to LR, delete render_deck.sh, split slides 3+8). No human escalation."
|
||||||
}
|
}
|
||||||
+119
-23
@@ -1,34 +1,128 @@
|
|||||||
---
|
---
|
||||||
project: acdl
|
project: acdl
|
||||||
milestone: v1.18
|
milestone: v1.22
|
||||||
generated_at: 2026-08-06
|
generated_at: 2026-08-11
|
||||||
generator: lead-developer
|
generator: lead-developer
|
||||||
verification_toolchain:
|
verification_toolchain:
|
||||||
typecheck: "python3 -m py_compile core/submission_readiness.py mcp/atelier/server.py && python3 -m jsonschema schemas/submission-readiness.schema.json"
|
typecheck: "python3 -m py_compile tests/test_slides_pipeline.py"
|
||||||
test: "pytest tests/test_submission_readiness.py tests/test_atelier_mcp.py # REQ-220 + REQ-225"
|
test: "pytest tests/test_slides_pipeline.py # REQ-254..262"
|
||||||
build: "bash scripts/render_deck.sh docs/presentations/nova-no-humans-platform-marp.md # HTML + PPTX (D-142)"
|
build: "bash scripts/render_slides.sh nova-autonomous-cloud-delivery # HTML + PPTX"
|
||||||
note: |
|
note: |
|
||||||
v1.18 adds the Citizen Developer & Production-Grade Guidance surface:
|
v1.22 is the Nova Deck Layout Fix — a docs-only NFR milestone. Two
|
||||||
submission-readiness gate, Atelier-derived skills, the Atelier MCP server
|
active personas: lead-developer (theme CSS + deck markdown + talking
|
||||||
(plugin-registry, stdio), and PPTX-as-first-class-artifact deck automation.
|
points + README + .ciagent metadata), backend-engineer (render scripts
|
||||||
Three active personas: lead-developer (coordination + decks + RACI/scope
|
+ tests). frontend-engineer stays deactivated (decks are markdown =
|
||||||
docs), backend-engineer (MCP server + submission-readiness validator +
|
lead-developer territory, per v1.17/v1.18 precedent). No data-engineer
|
||||||
render/attach scripts), data-engineer (submission-readiness schema if it
|
(no schema/DB changes). No new personas (the work is CSS + bash +
|
||||||
touches contract storage / DynamoDB shape). frontend-engineer stays
|
markdown + pytest, all within the two active personas' range).
|
||||||
deactivated (v1.18 has no frontend; decks are markdown = lead-developer
|
|
||||||
territory). The MCP plugin-registry is a backend pattern, so a separate
|
|
||||||
mcp-engineer persona is NOT added — it folds into backend-engineer.
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# ACDL — Persona Roster (v1.18 Citizen Developer & Production-Grade Guidance)
|
# ACDL — Persona Roster (v1.22 Nova Deck Layout Fix)
|
||||||
|
|
||||||
> v1.18 roster. Three active personas + one deactivated. The MCP server
|
> v1.22 roster. Two active personas + one deactivated. This is a docs-
|
||||||
> plugin-registry (D-140) is a backend pattern, not a new persona — it
|
> only NFR milestone: the work is theme CSS, render scripts, mermaid
|
||||||
> folds into backend-engineer. v1.17 precedent (frontend-engineer
|
> diagrams, deck markdown, and tests. frontend-engineer stays
|
||||||
> deactivated, decks are markdown = lead-developer territory) is upheld.
|
> deactivated (decks are markdown = lead-developer territory, per
|
||||||
|
> v1.17/v1.18 precedent). No data-engineer (no schema/DB changes).
|
||||||
|
|
||||||
## Active personas
|
## Active personas
|
||||||
|
|
||||||
|
### lead-developer
|
||||||
|
- **Domain:** coordination + deck content
|
||||||
|
- **Active:** true
|
||||||
|
- **Phase-specific:** false
|
||||||
|
- **Frameworks:** [] (no framework — owns process + narrative + CSS + markdown)
|
||||||
|
- **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"]
|
||||||
|
- **Territory:**
|
||||||
|
- `docs/presentations/assets/nova-sp-theme.css` (REQ-254,255,256 — theme CSS)
|
||||||
|
- `docs/presentations/nova-autonomous-cloud-delivery-marp.md` (REQ-261 — deck content)
|
||||||
|
- `docs/presentations/nova-autonomous-cloud-delivery.md` (REQ-261 — source of truth)
|
||||||
|
- `docs/presentations/nova-autonomous-cloud-delivery-talking-points.md` (REQ-261)
|
||||||
|
- `docs/presentations/README.md` (REQ-261 — slide-count convention)
|
||||||
|
- `docs/presentations/assets/mmd/*.mmd` (REQ-259,260 — mermaid re-layout)
|
||||||
|
- `.ciagent/**` (PROJECT, ROADMAP, REQUIREMENTS, RESEARCH, PLAN, GRILL, PERSONAS, REVIEW, CHECKPOINT)
|
||||||
|
- **Reason:** Owns the theme CSS (the root cause), the deck markdown
|
||||||
|
(trim/split overflowing slides), the mermaid re-layout, the talking
|
||||||
|
points, the README, and all CIAgent metadata. Is the only persona
|
||||||
|
that touches `.ciagent/**` and the deck markdown/CSS.
|
||||||
|
- **Phase-specific flag:** none (active for all of P0–P6).
|
||||||
|
|
||||||
|
### backend-engineer
|
||||||
|
- **Domain:** render scripts + tests
|
||||||
|
- **Active:** true
|
||||||
|
- **Phase-specific:** false
|
||||||
|
- **Frameworks:** ["bash", "pytest", "marp-cli", "mermaid-cli"]
|
||||||
|
- **Constraints:** ["pin CLI versions (no @latest)", "2x scale + transparent bg for mermaid", "tests must catch layout regressions", "no raw curl with shell-env tokens"]
|
||||||
|
- **Territory:**
|
||||||
|
- `scripts/render_slides.sh` (REQ-257,258 — pin versions, 2x scale)
|
||||||
|
- `scripts/render_deck.sh` (REQ-257 — DELETE)
|
||||||
|
- `tests/test_slides_pipeline.py` (REQ-262 — layout/aspect-ratio/theme-structural tests)
|
||||||
|
- `.github/workflows/slides.yml` (if references to render_deck.sh need removal)
|
||||||
|
- **Reason:** Owns the render pipeline (bash scripts) and the test
|
||||||
|
suite. The layout/aspect-ratio/theme-structural tests (REQ-262) are
|
||||||
|
the gap that let this regression through — backend-engineer owns
|
||||||
|
closing that gap. Pinning CLI versions and adding 2x scale are
|
||||||
|
backend/scripting tasks.
|
||||||
|
- **Phase-specific flag:** none (active for P2, P5; light touch on P0/P6).
|
||||||
|
|
||||||
|
## 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.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
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>v1.18 roster (Citizen Developer & Production-Grade Guidance) — superseded by v1.22</summary>
|
||||||
|
|
||||||
|
### Active personas (v1.18)
|
||||||
|
|
||||||
### lead-developer
|
### lead-developer
|
||||||
- **Domain:** coordination
|
- **Domain:** coordination
|
||||||
- **Active:** true
|
- **Active:** true
|
||||||
@@ -97,7 +191,7 @@ verification_toolchain:
|
|||||||
is backend; the schema it validates against is data).
|
is backend; the schema it validates against is data).
|
||||||
- **Phase-specific flag:** none (active for P3 schema + ingestor wiring).
|
- **Phase-specific flag:** none (active for P3 schema + ingestor wiring).
|
||||||
|
|
||||||
## Deactivated personas
|
### Deactivated personas (v1.18)
|
||||||
|
|
||||||
### frontend-engineer
|
### frontend-engineer
|
||||||
- **Active:** false
|
- **Active:** false
|
||||||
@@ -111,7 +205,7 @@ verification_toolchain:
|
|||||||
frontend / dashboard"). The MCP server exposes tools to an AI agent,
|
frontend / dashboard"). The MCP server exposes tools to an AI agent,
|
||||||
not a web UI. No reactivation trigger in this milestone.
|
not a web UI. No reactivation trigger in this milestone.
|
||||||
|
|
||||||
## Roster decisions
|
### Roster decisions (v1.18)
|
||||||
|
|
||||||
### D-143 (0.90): Fold mcp-engineer into backend-engineer
|
### D-143 (0.90): Fold mcp-engineer into backend-engineer
|
||||||
The MCP plugin-registry (D-140: `plugins/<name>.py register(mcp)`) is a
|
The MCP plugin-registry (D-140: `plugins/<name>.py register(mcp)`) is a
|
||||||
@@ -127,10 +221,12 @@ that MCP is a distinct protocol skill, but the SDK v2 API surface
|
|||||||
range (it's the same Pydantic/FastAPI-style pattern the persona already
|
range (it's the same Pydantic/FastAPI-style pattern the persona already
|
||||||
knows).
|
knows).
|
||||||
|
|
||||||
### Territory-overlap resolution (co-ownership)
|
### Territory-overlap resolution (v1.18)
|
||||||
|
|
||||||
| Path | Primary | Co-owner | Why |
|
| 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). |
|
| `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. |
|
| `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. |
|
| `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. |
|
||||||
|
|
||||||
|
</details>
|
||||||
@@ -2346,3 +2346,225 @@ committed directly).
|
|||||||
backend pattern (decorators, type hints, stdio, urllib). The SDK v2
|
backend pattern (decorators, type hints, stdio, urllib). The SDK v2
|
||||||
API surface is small and FastAPI/Pydantic-style (already in
|
API surface is small and FastAPI/Pydantic-style (already in
|
||||||
backend-engineer's range). D-143 logged in PERSONAS.md records this.
|
backend-engineer's range). D-143 logged in PERSONAS.md records this.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# v1.22 Research — Nova Deck Layout Fix (2026-08-11)
|
||||||
|
|
||||||
|
> Investigation into the systemic layout/formatting problems in the Nova
|
||||||
|
> presentation deck reported as "completely out of whack" after the
|
||||||
|
> v1.21 P5 re-render. This research IS the investigation — the findings
|
||||||
|
> below are the empirical root-cause analysis that drives the v1.22
|
||||||
|
> requirements (REQ-254..262).
|
||||||
|
|
||||||
|
## Background — why v1.22 exists
|
||||||
|
|
||||||
|
The v1.21 milestone shipped a refined deck (renamed to "Autonomous Cloud
|
||||||
|
Delivery Platform", 4-beat arc, 18 main + 1 appendix slides). The P5
|
||||||
|
phase re-rendered the HTML + PPTX and added two new mermaid diagrams
|
||||||
|
(`platform-pipeline.png`, `telemetry-live-ops.png`). After P5, the user
|
||||||
|
reported that the layout is "completely out of whack" and that "they all
|
||||||
|
have layout issues." This research identifies the root cause and the fix
|
||||||
|
scope.
|
||||||
|
|
||||||
|
## FINDING 1 — Theme CSS has ZERO section padding (CONFIDENCE: VERY HIGH)
|
||||||
|
|
||||||
|
`docs/presentations/assets/nova-sp-theme.css` line 1 is
|
||||||
|
`/* @theme nova-sp */` — a **comment**, not the `@theme` directive that
|
||||||
|
Marp uses to register a theme name. The theme does **not `@import`**
|
||||||
|
Marp's default theme. Marp's built-in default theme applies
|
||||||
|
`section { padding: 56px 64px; }`. Because this custom theme neither
|
||||||
|
imports the default nor sets its own `padding`, the rendered `<section>`
|
||||||
|
has **zero padding**.
|
||||||
|
|
||||||
|
**Verification:** grep for `padding:56px` / `padding:64px` /
|
||||||
|
`padding:96px` in the rendered HTML returns **zero matches**. The only
|
||||||
|
`section` rules in the rendered HTML are:
|
||||||
|
- `section{width:1280px;height:720px;box-sizing:border-box;overflow:hidden;position:relative;...}`
|
||||||
|
(marpit base — no padding)
|
||||||
|
- `section{font-family:...;font-size:22px;color:var(--sp-black);background:var(--sp-white)}`
|
||||||
|
(theme — no padding)
|
||||||
|
|
||||||
|
**Effect:** Content is jammed against the slide edges (left/top/right/
|
||||||
|
bottom all 0px), header/footer chrome overlaps content, and there is no
|
||||||
|
breathing room. This alone makes every slide look "out of whack."
|
||||||
|
|
||||||
|
## FINDING 2 — overflow:hidden silently clips dense content (CONFIDENCE: VERY HIGH)
|
||||||
|
|
||||||
|
The marpit base rule sets `overflow:hidden` on `section`. The theme adds
|
||||||
|
no `overflow` override, no scaling, no shrink-to-fit. Any slide whose
|
||||||
|
content exceeds 720px is **clipped with no visual indication**. Combined
|
||||||
|
with zero padding, content-dense slides (tables, image+bullets) lose
|
||||||
|
their bottom rows / benefit paragraphs.
|
||||||
|
|
||||||
|
**Per-slide overflow risk table** (available content height ≈ 720px −
|
||||||
|
header(~35px) − footer(~35px) − padding(0px) = ~650px):
|
||||||
|
|
||||||
|
| # | Slide | Est. height | Fits? | Issue |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 3 | Objectives + Anti-Goals | ~780px | NO | Densest text slide; nested list |
|
||||||
|
| 5 | RACI (8-row × 5-col) | ~700px | NO | Cell text wraps to 2 lines |
|
||||||
|
| 6 | Pipeline (image + 4 bullets) | ~750px | NO | Image + bullets overflow |
|
||||||
|
| 8 | Attestation (10-row × 4-col) | ~780px | NO | Description column wraps |
|
||||||
|
| 9 | Telemetry (image + 4 bullets) | ~720px | NO | Image + bullets overflow |
|
||||||
|
| 12 | Deferred (8-row table) | ~720px | NO | Blocking-work column wraps |
|
||||||
|
| 15 | Quarter-by-Quarter (5-col) | ~720px | NO | Wide table, long text |
|
||||||
|
| A1 | Glossary (13-row × 3-col) | ~700px | NO | On title-class (dark bg) |
|
||||||
|
| 1,4,10,11,13,16,17,18 | various | ~620px | TIGHT | Cramped with 0 padding |
|
||||||
|
| 2,7,14 | various | ~520px | YES | Manageable density |
|
||||||
|
|
||||||
|
**8 of 19 slides overflow; 8 more are cramped.**
|
||||||
|
|
||||||
|
## FINDING 3 — Image aspect-ratio catastrophe on slides 6 & 9 (CONFIDENCE: HIGH)
|
||||||
|
|
||||||
|
The two new P5 PNGs have extreme, opposite aspect ratios:
|
||||||
|
|
||||||
|
- `platform-pipeline.png` = **1568×116** (aspect 13.52, ultra-wide/short).
|
||||||
|
The deck uses `![w:1000]`. At width=1000px, height = 1000/13.52 =
|
||||||
|
**74px**. The `max-height:320px` rule never engages. The image renders
|
||||||
|
as a 1000×74 thin strip — text in nodes is nearly unreadable, and the
|
||||||
|
10-node LR flowchart is squashed.
|
||||||
|
|
||||||
|
- `telemetry-live-ops.png` = **1024×1628** (aspect 0.63, tall). The deck
|
||||||
|
uses `![w:900]`. At width=900px the natural height would be **1428px**
|
||||||
|
— but `max-height:320px` clamps it, so the image actually renders at
|
||||||
|
**~201×320**. The `w:900` directive is **completely overridden** by
|
||||||
|
`max-height:320px`. The image is tiny and the explicit width is
|
||||||
|
ignored. The `.mmd` uses `flowchart TB` (top-bottom) — exactly the
|
||||||
|
failure mode the README (line 168) warns against.
|
||||||
|
|
||||||
|
## FINDING 4 — Header+footer chrome on every slide (CONFIDENCE: HIGH)
|
||||||
|
|
||||||
|
The frontmatter sets both `header:` and `footer:` to the full 51-char
|
||||||
|
deck title "Nova — The Autonomous Cloud Delivery Platform" on **every**
|
||||||
|
slide (including the title slide, which has `data-header`/`data-footer`
|
||||||
|
attributes present but `_paginate: false` only suppresses the page
|
||||||
|
number, not the header/footer). The theme gives header a `border-bottom`
|
||||||
|
and footer a `border-top`, each consuming ~30-40px of vertical chrome.
|
||||||
|
With zero section padding, the header text sits at the very top edge and
|
||||||
|
the footer at the very bottom edge, visually colliding with slide
|
||||||
|
content. This reduces the effective content area from 720px to roughly
|
||||||
|
640-650px on every slide.
|
||||||
|
|
||||||
|
## FINDING 5 — render_deck.sh produces unthemed output (CONFIDENCE: MEDIUM-HIGH)
|
||||||
|
|
||||||
|
`scripts/render_deck.sh` (line 44) runs marp-cli **without `--theme`**,
|
||||||
|
relying on the frontmatter `theme: nova-sp`. But `nova-sp` is **not a
|
||||||
|
built-in Marp theme** — it's a custom CSS file. Marp resolves `theme:`
|
||||||
|
frontmatter against its built-in theme registry (default, gaia, uncover)
|
||||||
|
and registered custom themes via `--theme-set`. Without `--theme <file>`
|
||||||
|
or `--theme-set`, Marp cannot resolve `nova-sp` and **falls back to the
|
||||||
|
default theme** (or errors). The committed HTML was rendered by
|
||||||
|
`render_slides.sh` (which correctly passes `--theme`), so the committed
|
||||||
|
artifact is fine — but `render_deck.sh` is a stale, dangerous script
|
||||||
|
that would produce an unthemed/default-themed deck if anyone ran it.
|
||||||
|
The README (line 201) documents `render_slides.sh` as canonical;
|
||||||
|
`render_deck.sh` is not mentioned in the build-commands section.
|
||||||
|
|
||||||
|
## FINDING 6 — render_slides.sh missing 2x scale + transparent bg (CONFIDENCE: HIGH)
|
||||||
|
|
||||||
|
`render_slides.sh` mermaid invocation (lines 51-55) does **NOT** pass
|
||||||
|
`-s 2` (2x scale) or `-b transparent`, despite the README (line 193)
|
||||||
|
documenting both as required. This is why `platform-pipeline.png` is
|
||||||
|
only 1568px wide (1x) instead of 3136px (2x) — the rendered PNGs are
|
||||||
|
lower resolution than the README specifies, contributing to illegibility
|
||||||
|
when scaled.
|
||||||
|
|
||||||
|
## FINDING 7 — P5 marp-cli version bump (CONFIDENCE: LOW — not the cause)
|
||||||
|
|
||||||
|
The P3→P5 HTML diff is 831 changed lines, but the **theme CSS portion
|
||||||
|
is byte-identical** (verified: `font-size:22px`, `max-height:320px`,
|
||||||
|
`marpit-root-font-size:22px`, `--sp-red:#D6002A` all match; `sp-red`
|
||||||
|
appears exactly once in both). The large diff is:
|
||||||
|
- (a) marp-cli boilerplate (bespoke-marp presenter/overview/transition
|
||||||
|
CSS) changed due to a marp-cli version bump (neither script pins a
|
||||||
|
version — both use `@latest`), and
|
||||||
|
- (b) content changes: title "No-Humans Infrastructure Platform" →
|
||||||
|
"Autonomous Cloud Delivery Platform", footer "Act %{page}/5 — v1.20"
|
||||||
|
→ deck title, slide count 20 → 19.
|
||||||
|
|
||||||
|
The version bump did **not** alter the slide layout engine or the theme
|
||||||
|
rules. **This is not the regression source.** The layout problems are
|
||||||
|
inherent to the theme CSS (zero padding, no overflow handling, blunt
|
||||||
|
image rule) which has been unchanged. P5 made the content denser (new
|
||||||
|
diagrams with extreme aspect ratios, longer deck-title header/footer)
|
||||||
|
which made the pre-existing theme flaws more visible.
|
||||||
|
|
||||||
|
## FINDING 8 — Test coverage gaps (CONFIDENCE: VERY HIGH)
|
||||||
|
|
||||||
|
`tests/test_slides_pipeline.py` (268 lines) checks **static file
|
||||||
|
properties only**:
|
||||||
|
- Theme CSS file exists and contains `#D6002A` / `#1B1B1B`
|
||||||
|
- Frontmatter references `nova-sp`, not `default`
|
||||||
|
- `render_slides.sh` exists, is executable, invokes mermaid-cli + marp-cli
|
||||||
|
- Every `.mmd` has a `.png`
|
||||||
|
- No maturity badges, no version in footer, slide count = 18+1
|
||||||
|
- No D-###/REQ-###/internal `.py` paths in slides
|
||||||
|
|
||||||
|
**What is NOT tested (the gaps that let layout regressions through):**
|
||||||
|
1. NO rendered-dimension / overflow test — no test renders the HTML and
|
||||||
|
checks that each slide's content height ≤ 720px.
|
||||||
|
2. NO theme-CSS structural test — no test asserts `section` has
|
||||||
|
`padding`, that `overflow` is handled, or that `img` rules don't
|
||||||
|
conflict with `w:`/`h:` directives.
|
||||||
|
3. NO image aspect-ratio / legibility test — no test checks that PNG
|
||||||
|
dimensions are reasonable for a 16:9 slide.
|
||||||
|
4. NO render-script theme-flag test — no test asserts `render_deck.sh`
|
||||||
|
passes `--theme` (it doesn't), so the broken script passes CI.
|
||||||
|
5. NO rendered-HTML structural assertion — no test parses the committed
|
||||||
|
HTML to verify the theme is actually embedded.
|
||||||
|
6. NO mermaid render-scale test — no test verifies PNGs are 2x scale.
|
||||||
|
|
||||||
|
**Conclusion:** A layout regression — including the current zero-padding,
|
||||||
|
image-clamping, and table-overflow problems — would pass every existing
|
||||||
|
test. This is why the user's "completely out of whack" report was not
|
||||||
|
caught.
|
||||||
|
|
||||||
|
## Theme CSS gaps (summary)
|
||||||
|
|
||||||
|
1. NO `padding` on `section` (lines 21-26 set font/color/bg only).
|
||||||
|
2. NO `overflow` handling on `section`.
|
||||||
|
3. NO `@import` of a base theme (line 1 is a comment, not `@theme`).
|
||||||
|
4. NO rule for the `h2` + bold-lead-paragraph pattern (default `<p>`
|
||||||
|
margins waste ~44px each).
|
||||||
|
5. Table cell padding `6px 10px` too generous for 10-13 row tables.
|
||||||
|
6. `img { max-height: 320px }` is a blunt instrument that breaks `w:`
|
||||||
|
directives on tall images and does nothing for ultra-wide images.
|
||||||
|
7. Header/footer have no padding/margin — collide with content at 0
|
||||||
|
section padding.
|
||||||
|
8. `section.title` does not suppress header/footer.
|
||||||
|
9. NO rule for `ol` (only `ul`/`li` styled).
|
||||||
|
10. NO `@media print` overrides for PPTX export fidelity.
|
||||||
|
|
||||||
|
## Assumptions logged (v1.22)
|
||||||
|
|
||||||
|
- **A1 (0.95):** The theme CSS is the primary root cause. Adding
|
||||||
|
`section { padding: 48px 56px 40px; }` alone would fix the "jammed
|
||||||
|
against edges" look on all 19 slides. Confidence grounded in the
|
||||||
|
grep verification (zero padding matches in rendered HTML).
|
||||||
|
- **A2 (0.9):** The P5 re-render is NOT a regression — the theme CSS is
|
||||||
|
byte-identical P3→P5. P5's denser content (new diagrams, longer
|
||||||
|
header/footer) made pre-existing flaws visible. Grounded in the
|
||||||
|
byte-level diff comparison.
|
||||||
|
- **A3 (0.9):** `render_deck.sh` should be deleted, not fixed. The
|
||||||
|
README already documents `render_slides.sh` as canonical; keeping a
|
||||||
|
second broken script is a footgun. Grounded in the README build-
|
||||||
|
commands section (line 201) which does not mention `render_deck.sh`.
|
||||||
|
- **A4 (0.85):** Splitting slides 3 and 8 (18 → 20 main) is preferable
|
||||||
|
to trimming content, because the content is leadership-relevant and
|
||||||
|
should not be lost. The slide-count test + README convention are
|
||||||
|
updated to match. Grounded in the overflow estimates (slides 3 and 8
|
||||||
|
are the densest at ~780px).
|
||||||
|
- **A5 (0.8):** Pinning marp-cli/mermaid-cli versions is necessary to
|
||||||
|
prevent uncontrolled boilerplate-CSS drift. The exact pinned versions
|
||||||
|
will be determined during P2 execution by testing which version
|
||||||
|
produces stable output in this environment.
|
||||||
|
|
||||||
|
## Decisions surfaced (research → bound in CLARIFY)
|
||||||
|
|
||||||
|
All 5 CLARIFY decisions are grounded in these findings:
|
||||||
|
- Comprehensive scope (FINDINGS 1-8 span 4 layers)
|
||||||
|
- Full pipeline (new milestone, complete audit trail)
|
||||||
|
- 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)
|
||||||
|
|||||||
Reference in New Issue
Block a user