diff --git a/.ciagent/CHECKPOINT.json b/.ciagent/CHECKPOINT.json index 273b809..4f0c636 100644 --- a/.ciagent/CHECKPOINT.json +++ b/.ciagent/CHECKPOINT.json @@ -1,12 +1,12 @@ { - "phase": 6, + "phase": 5, "stage": "complete", - "milestone": "v1.21", - "phase_role": "final", + "milestone": "v1.22", + "phase_role": "execution", "attempts": 0, - "updated_at": "2026-08-11T00:30:00Z", - "milestone_complete": true, - "tag": "v1.20.6", - "requirements": ["REQ-245","REQ-246","REQ-247","REQ-248","REQ-249","REQ-250","REQ-251","REQ-252","REQ-253"], - "notes": "v1.21 milestone complete. 9 requirements (REQ-245..253) across 6 execution phases + P0 pre-execution. P1 strategic-docs (thesis rename + NORTH_STAR objectives + RACI restructure); P2 slides source-of-truth (rename + restructure + rewrite, 18 main + 1 appendix); P3 marp deck + talking points + README + theme CSS fix; P4 pipeline hardening (Checkov before plan, Wiz-or-Checkov on plan, never both); P5 render + verify (new diagrams, HTML, PPTX, 686 tests pass + 1 pre-existing attestation env failure). Deck renamed nova-no-humans-platform* -> nova-autonomous-cloud-delivery*. Title: 'Nova — The Autonomous Cloud Delivery Platform'. 4-beat arc (Problem -> Solution -> Proof -> Roadmap + Ask). All 33 review notes applied. Tags on v1.20.x line (v1.20.0 P0 -> v1.20.6 P6 final). Next milestone starts fresh." + "updated_at": "2026-08-11T15:10:00Z", + "milestone_complete": false, + "tag": "v1.21.5", + "requirements": ["REQ-262"], + "notes": "v1.22 P5 complete. Tag v1.21.5. HTML+PPTX re-rendered (22 slides, 23 media). 9 new layout/aspect-ratio/theme-structural tests added. 32 slide tests pass, 94 key-file tests pass, pipeline check exit 0. Proceeding to P6 (final review + audit + milestone ship)." } \ No newline at end of file diff --git a/.ciagent/PERSONAS.md b/.ciagent/PERSONAS.md index 652e384..1bda1d1 100644 --- a/.ciagent/PERSONAS.md +++ b/.ciagent/PERSONAS.md @@ -1,34 +1,128 @@ --- project: acdl -milestone: v1.18 -generated_at: 2026-08-06 +milestone: v1.22 +generated_at: 2026-08-11 generator: lead-developer verification_toolchain: - typecheck: "python3 -m py_compile core/submission_readiness.py mcp/atelier/server.py && python3 -m jsonschema schemas/submission-readiness.schema.json" - test: "pytest tests/test_submission_readiness.py tests/test_atelier_mcp.py # REQ-220 + REQ-225" - build: "bash scripts/render_deck.sh docs/presentations/nova-no-humans-platform-marp.md # HTML + PPTX (D-142)" + 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" note: | - v1.18 adds the Citizen Developer & Production-Grade Guidance surface: - submission-readiness gate, Atelier-derived skills, the Atelier MCP server - (plugin-registry, stdio), and PPTX-as-first-class-artifact deck automation. - Three active personas: lead-developer (coordination + decks + RACI/scope - docs), backend-engineer (MCP server + submission-readiness validator + - render/attach scripts), data-engineer (submission-readiness schema if it - touches contract storage / DynamoDB shape). frontend-engineer stays - 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. + 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). --- -# 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 -> plugin-registry (D-140) is a backend pattern, not a new persona — it -> folds into backend-engineer. v1.17 precedent (frontend-engineer -> deactivated, decks are markdown = lead-developer territory) is upheld. +> 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). ## 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 + +
+v1.18 roster (Citizen Developer & Production-Grade Guidance) — superseded by v1.22 + +### Active personas (v1.18) + ### lead-developer - **Domain:** coordination - **Active:** true @@ -97,7 +191,7 @@ verification_toolchain: is backend; the schema it validates against is data). - **Phase-specific flag:** none (active for P3 schema + ingestor wiring). -## Deactivated personas +### Deactivated personas (v1.18) ### frontend-engineer - **Active:** false @@ -111,7 +205,7 @@ verification_toolchain: frontend / dashboard"). The MCP server exposes tools to an AI agent, 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 The MCP plugin-registry (D-140: `plugins/.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 knows). -### Territory-overlap resolution (co-ownership) +### 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. | \ No newline at end of file +| `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. | + +
\ No newline at end of file diff --git a/.ciagent/PLAN.md b/.ciagent/PLAN.md index 0ce4f1f..9d265ce 100644 --- a/.ciagent/PLAN.md +++ b/.ciagent/PLAN.md @@ -1098,5 +1098,360 @@ NOT exercised here. 8. **No new frontend (frontend-engineer deactivated).** v1.18 has no frontend; decks are markdown (lead-developer territory); the MCP server exposes tools to an AI agent, not a web UI. The - frontend-engineer persona stays deactivated (PERSONAS.md v1.18 - roster). No reactivation trigger in this milestone. \ No newline at end of file + frontend-engineer persona stays deactivated (PERSONAS.md v1.18 + roster). No reactivation trigger in this milestone. + +--- + +# Nova — Phase Plan v1.22 (Nova Deck Layout Fix) + +> **Milestone:** v1.22 — Nova Deck Layout Fix +> **Branch:** `milestone/v1.22-deck-layout-fix` → merge to `main` at P6. +> Phase branches: `phase/00-pre-execution`, `phase/01-theme-css`, +> `phase/02-render-scripts`, `phase/03-mermaid-relayout`, +> `phase/04-deck-content`, `phase/05-render-and-test`, +> `phase/06-final-review-ship`. +> **Tag line:** `v1.21.x` patch line — `v1.21.0` (P0) → +> `v1.21.1..v1.21.5` (P1–P5) → `v1.21.6` (P6 final = milestone release). +> v1.22 is an NFR milestone (all phases are fix/docs/test) → +> progressive patches. +> **Phase count:** 7 (P0 pre-execution + 5 execution + 1 final). +> **Source of truth for requirements:** `.ciagent/REQUIREMENTS.md` §v1.22 +> (REQ-254..262, 9 requirements). +> **Source of truth for research:** `.ciagent/RESEARCH.md` §v1.22 (8 +> findings, 5 assumptions, 5 CLARIFY decisions). +> **Source of truth for personas:** `.ciagent/PERSONAS.md` v1.22 roster +> (2 active: lead-developer + backend-engineer; 2 deactivated: +> frontend + data). + +## Wave Ordering + +| Wave | Phases | Rationale | +|------|--------|-----------| +| Wave 1 | P1, P2 (**parallel**) | P1 (theme CSS: padding, overflow, image, title chrome) + P2 (render scripts: delete render_deck.sh, pin versions, 2x scale). Zero file overlap: P1 touches `docs/presentations/assets/nova-sp-theme.css`; P2 touches `scripts/render_slides.sh` + deletes `scripts/render_deck.sh`. P1 establishes the padding/overflow/image budget that P4's content trimming relies on; P2 fixes the render pipeline that P3's PNG re-render depends on. | +| Wave 2 | P3, P4 (**parallel**) | P3 (mermaid re-layout: telemetry LR, platform-pipeline 2-row wrap) + P4 (deck content: trim/split 8 overflowing slides, remove header). P3 depends on P2 (2x scale flag); P4 depends on P1 (padding budget). Zero file overlap: P3 touches `docs/presentations/assets/mmd/*.mmd` + PNGs; P4 touches `docs/presentations/nova-autonomous-cloud-delivery-marp.md` + source `.md` + talking-points + README. | +| Wave 3 | P5 | Re-render HTML + PPTX + add tests. Depends on all above (P1 theme, P2 scripts, P3 diagrams, P4 content). Re-renders via the fixed `render_slides.sh`; adds the layout/aspect-ratio/theme-structural tests (the gap that let this through). | +| Wave 4 | P6 | Final review + audit + milestone ship. Merge to main, tag `v1.21.6`, create release, attach PPTX. | + +## Phase P0 — pre-execution (DONE) + +SPECIFY → CLARIFY → RESEARCH → PLAN. Validated v1.22 requirements +(REQ-254..262). Established `active_milestone: "v1.22"`. Root-cause +investigation persisted to RESEARCH.md (8 findings). Persona roster +updated (2 active, 2 deactivated). 5 CLARIFY decisions auto-resolved. + +## Phase P1 — theme-css (fix) — lead-developer + +**Requirements:** REQ-254, REQ-255, REQ-256 +**Branch:** `phase/01-theme-css` +**Territory:** `docs/presentations/assets/nova-sp-theme.css` + +### Tasks + +1. **REQ-254 — section padding + overflow:** + - Add `section { padding: 48px 56px 40px; }` (top reserves header + space; bottom reserves footer). + - Add `section { overflow: auto; }` as an authoring-time signal + (dense content scrolls instead of silently clipping). Document + that the real fix is content trimming (P4), not runtime scroll. +2. **REQ-255 — aspect-ratio-aware image rules:** + - Replace `img { display: block; margin: 0 auto; max-height: 320px }` + with `img { display: block; margin: 0 auto; max-width: 100%; + max-height: 380px; object-fit: contain; }`. + - Add `.wide` class: `img.wide { max-height: 280px; }` (for ultra-wide + diagrams). + - Add `.tall` class: `img.tall { max-height: 480px; }` (for tall + diagrams that need more vertical room). +3. **REQ-256 — title chrome + spacing tightening:** + - Add `section.title header, section.title footer { display: none; }`. + - Add `section h2 + p { margin-top: 0.2em; }`. + - Add `section p { margin: 0.4em 0; }`. + - Add `ol` styling: `ol { margin-top: 0.3em; }` (match `ul`). + - Add `table.dense td, table.dense th { padding: 4px 8px; }` (for + tables with ≥8 rows). + - Add `@media print { section { overflow: hidden; } }` (PPTX export + fidelity — no scrollbars in exported slides). + +### Verify (inline) +- `python3 -c "from pathlib import Path; css = Path('docs/presentations/assets/nova-sp-theme.css').read_text(); assert 'padding:' in css and 'section.title header' in css and 'object-fit' in css and 'table.dense' in css; print('theme CSS OK')"` +- `pytest tests/test_slides_pipeline.py -k "theme" -q` (existing theme + color tests still pass). + +### Ship +- Tag `v1.21.1`, merge `phase/01-theme-css` → `milestone/v1.22-deck-layout-fix`. + +## Phase P2 — render-scripts (fix) — backend-engineer + +**Requirements:** REQ-257, REQ-258 +**Branch:** `phase/02-render-scripts` +**Territory:** `scripts/render_slides.sh`, `scripts/render_deck.sh` (DELETE) + +### Tasks + +1. **REQ-257 — delete render_deck.sh + pin CLI versions:** + - `git rm scripts/render_deck.sh` (the README already documents + `render_slides.sh` as canonical; `render_deck.sh` omits `--theme` + and produces unthemed output). + - Pin marp-cli and mermaid-cli versions in `render_slides.sh`: + replace `@marp-team/marp-cli@latest` with a pinned version (e.g. + `@marp-team/marp-cli@4.0.0` — determine the working version by + testing during execution) and `@mermaid-js/mermaid-cli@latest` + with a pinned version (e.g. `@mermaid-js/mermaid-cli@10.9.1`). + - Remove any references to `render_deck.sh` from + `.github/workflows/slides.yml`, `docs/presentations/README.md`, + and `tests/test_slides_pipeline.py` (if any test references it). +2. **REQ-258 — 2x scale + transparent bg for mermaid:** + - In `render_slides.sh` lines 51-55, add `-s 2 -b transparent` to + the mermaid-cli invocation (matches README line 193 spec). + +### Verify (inline) +- `test ! -f scripts/render_deck.sh && echo "render_deck.sh deleted OK"` +- `grep -q "marp-cli@" scripts/render_slides.sh && grep -q "mermaid-cli@" scripts/render_slides.sh && echo "versions pinned OK"` +- `grep -q -- "-s 2" scripts/render_slides.sh && grep -q -- "-b transparent" scripts/render_slides.sh && echo "2x + transparent OK"` +- `pytest tests/test_slides_pipeline.py -k "render" -q` (existing + render-script tests still pass; update if they reference + `render_deck.sh`). + +### Ship +- Tag `v1.21.2`, merge `phase/02-render-scripts` → `milestone/v1.22-deck-layout-fix`. + +## Phase P3 — mermaid-relayout (fix) — lead-developer + +**Requirements:** REQ-259, REQ-260 +**Branch:** `phase/03-mermaid-relayout` +**Territory:** `docs/presentations/assets/mmd/telemetry-live-ops.mmd`, + `docs/presentations/assets/mmd/platform-pipeline.mmd`, PNG re-render + (via `render_slides.sh` — backend-engineer co-owns the script + invocation). + +### Tasks + +1. **REQ-259 — telemetry-live-ops.mmd TB → LR:** + - Rewrite `docs/presentations/assets/mmd/telemetry-live-ops.mmd` from + `flowchart TB` to `flowchart LR` with subgraph row-wrapping (per + README line 168). Target aspect ratio ∈ [1.2, 2.5]. + - Re-render PNG: `bash scripts/render_slides.sh nova-autonomous-cloud-delivery` + (now with 2x scale + transparent bg from P2). + - Update the Marp deck's `![w:900]` directive on slide 9 to match + the new dimensions (or replace with `![h:320]` if the diagram + remains taller than wide after re-layout — but LR should produce + a wide diagram). +2. **REQ-260 — platform-pipeline.mmd 2-row wrap:** + - Rewrite `docs/presentations/assets/mmd/platform-pipeline.mmd` to + wrap the 10-node LR chain into 2 rows via mermaid subgraphs (or + split into two stages: static-scan row + runtime-scan row). Target + aspect ratio ∈ [1.2, 2.5]. + - Re-render PNG (same command as above). + +### Verify (inline) +- `python3 -c "from PIL import Image; import os; d='docs/presentations/assets/png'; [print(f, Image.open(os.path.join(d,f)).size) for f in os.listdir(d) if f.endswith('.png')]"` (check aspect ratios — or use a stdlib-only check if PIL unavailable). +- Verify both re-rendered PNGs have aspect ratio ∈ [1.2, 2.5]. + +### Ship +- Tag `v1.21.3`, merge `phase/03-mermaid-relayout` → `milestone/v1.22-deck-layout-fix`. + +## Phase P4 — deck-content (fix) — lead-developer + +**Requirements:** REQ-261 +**Branch:** `phase/04-deck-content` +**Territory:** `docs/presentations/nova-autonomous-cloud-delivery-marp.md`, + `docs/presentations/nova-autonomous-cloud-delivery.md`, + `docs/presentations/nova-autonomous-cloud-delivery-talking-points.md`, + `docs/presentations/README.md`. + +### Tasks + +1. **Split slide 3** (Objectives + Anti-Goals) into: + - Slide 3a — Strategic Objectives (4 objectives + nested sub-list). + - Slide 3b — Anti-Goals (4 anti-goals + benefit). + Main slide count 18 → 19. +2. **Split slide 8** (Attestation Matrix) into: + - Slide 8a — Attestation: QA (3 qa rows + separation-of-duties note). + - Slide 8b — Attestation: Prod/DR (7 prod/dr rows + benefit). + Main slide count 19 → 20. +3. **Trim slide 5** (RACI): apply `table.dense` class (from P1) to + reduce cell padding; keep 8 rows. +4. **Trim slide 6** (Pipeline): reduce to 3 bullets (the 4th is covered + by the diagram, now legible after P3). +5. **Trim slide 9** (Telemetry): reduce to 3 bullets; image now legible + after P3. +6. **Trim slide 12** (Deferred): reduce to 6 rows (merge the 3 "Live + AWS re-provisioning" blockers into one row). +7. **Trim slide 15** (Quarter-by-Quarter): drop the "Grounding" column + (redundant with strategic objectives); 4 columns fit better. +8. **Trim Appendix A1** (Glossary): apply `table.dense` class (16px + font); keep 13 rows. +9. **Remove `header:` from frontmatter** (keep `footer:` + `paginate: + true` only). The full 51-char deck title in BOTH header and footer + is redundant chrome; the footer alone suffices. +10. **Update talking-points.md** to match the new 20 main + 1 appendix + slide structure. +11. **Update README.md** "18 main + 1 appendix" convention (line 130) + → "20 main + 1 appendix". +12. **Update `test_marp_deck_slide_count`** in + `tests/test_slides_pipeline.py` to assert 20 main + 1 appendix + (this test is co-owned with backend-engineer per PERSONAS.md, but + the assertion value reflects lead-developer's deck structure + decision — lead-developer makes the edit here). + +### Verify (inline) +- `pytest tests/test_slides_pipeline.py -k "slide_count" -q` (updated + test passes with 20 main + 1 appendix). +- `grep -c "## Slide " docs/presentations/nova-autonomous-cloud-delivery-marp.md` → 20. +- `grep -c "## Appendix " docs/presentations/nova-autonomous-cloud-delivery-marp.md` → 1. +- `grep -q "^header:" docs/presentations/nova-autonomous-cloud-delivery-marp.md && echo "FAIL: header still present" || echo "header removed OK"`. + +### Ship +- Tag `v1.21.4`, merge `phase/04-deck-content` → `milestone/v1.22-deck-layout-fix`. + +## Phase P5 — render-and-test (test) — backend-engineer + +**Requirements:** REQ-262 +**Branch:** `phase/05-render-and-test` +**Territory:** `tests/test_slides_pipeline.py` (test code — backend), + re-render invocation (backend). Assertions reflect lead-developer's + deck/theme decisions (co-owned). + +### Tasks + +1. **Re-render HTML + PPTX:** + - `bash scripts/render_slides.sh nova-autonomous-cloud-delivery` → + re-renders all mermaid PNGs (2x transparent) + HTML + PPTX. + - Verify slide count (20 main + 1 appendix = 21 `
` elements + in the HTML + 1 title = 22 total — or however Marp counts the title + slide; verify against the marp deck). + - Verify media embedding (PPTX has embedded PNGs). +2. **Add tests to `tests/test_slides_pipeline.py`:** + - `test_theme_css_has_section_padding` — assert `section` rule in + `nova-sp-theme.css` contains `padding`. + - `test_theme_css_suppresses_title_chrome` — assert + `section.title header` and `section.title footer` have + `display: none`. + - `test_png_aspect_ratios_sane` — for every PNG in `assets/png/`, + assert aspect ratio ∈ [1.2, 2.5] (catches the 13.52× and 0.63× + outliers). Use `struct`/`imghdr` or a minimal PNG header parser + (no PIL dependency if possible). + - `test_render_slides_has_2x_scale` — assert `render_slides.sh` + contains `-s 2` and `-b transparent`. + - `test_render_deck_removed` — assert `scripts/render_deck.sh` does + not exist. + - `test_html_embeds_theme` — assert committed HTML contains + `--sp-red` and `padding` in the inline `
-
Nova — The Autonomous Cloud Delivery Platform
- +Nova — The Autonomous Cloud Delivery Platform

Nova — The Autonomous Cloud Delivery Platform

Shifting from Operational Overhead to Strategic Value

Product Development & Citizen Developer Overview

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
+

Slide 1 — The Problem

Product teams now own their cloud infrastructure — but ownership without discipline is destroying value.

    @@ -21,8 +18,7 @@

    Benefit: the answer is an autonomous cloud delivery platform that encodes discipline as policy, scans proactively, remediates rapidly, and makes operations visible to leadership rather than hidden in tribal knowledge.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
+

Slide 2 — Nova's Vision

Infrastructure operations become visible. Every environment provisioned, every incident healed, every risk remediated — by an autonomous system whose trustworthiness is provable, not promised. Human attestation remains required at stage gates; the operator is never in the loop of normal operations.

@@ -35,9 +31,8 @@

Benefit: the destination is autonomous operations with provable trust — security, remediation velocity, reliability, and lead time made visible to leadership, not promised to them.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 3 — Strategic Objectives + Anti-Goals

+
+

Slide 3 — Strategic Objectives

4 Strategic Objectives:

  1. Zero-touch operations — autonomy as the default, not the demo; stage-gate attestation (QA, SRE) remains human by design
  2. @@ -49,19 +44,22 @@
  3. Integrate with externally owned development platforms — regardless of source — PDLC, SDLC, Agentic, or Citizen Developer; Nova provides skills + MCP endpoints; all prod intents go through the same controls and quality gates
-

4 Anti-Goals (what Nova is NOT):

+

Benefit: the scope is explicit — Nova governs infrastructure and delivery, integrates with any upstream source through one validated contract, and measures success on four metrics a CTO can repeat back.

+
Nova — The Autonomous Cloud Delivery Platform
+
+
+

Slide 4 — Anti-Goals (What Nova Is NOT)

  1. Not a general-purpose AI agent platform
  2. Not a system that removes humans from accountability — only from normal operations
  3. Not an upstream development platform (no product backlogs, IDE, code authorship)
  4. Not a replacement for the Product Development Lifecycle (PDLC)
-

Benefit: the scope is explicit — Nova governs infrastructure and delivery, integrates with any upstream source through one validated contract, and measures success on four metrics a CTO can repeat back.

+

Benefit: the boundaries are explicit — Nova is purpose-built for infrastructure operations and delivery, not a general-purpose AI agent or an upstream development platform.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 4 — Scope: Downstream of PDLC

+
+

Slide 5 — Scope: Downstream of PDLC

Nova governs infrastructure and delivery. The PDLC is upstream — Nova never penetrates it. Integration is through one validated contract.

  • The PDLC is upstream: product backlog, code authorship (AI agent, IDE, agentic SDLC), sprint planning, application business logic
  • @@ -72,9 +70,8 @@

    Benefit: a clean scope boundary — Nova is purpose-built for infrastructure operations and integrates with any upstream source through one validated contract, so the platform team's surface area stays bounded.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 5 — RACI: Who Owns What

+
+

Slide 6 — RACI: Who Owns What

Four roles, one matrix — citizen developer owns FRs + UAT, platform owns NFRs + infra, quality engineering owns the gate evidence, SRE owns operational readiness.

@@ -149,23 +146,20 @@

Benefit: every party knows what they bring, what the platform provides, what quality engineering guards, and where SRE signs off — accountability is explicit, never diffuse.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 6 — The Platform Pipeline

+
+

Slide 7 — The Platform Pipeline

How intent becomes verified infrastructure — fail-fast policy scanning before the plan, runtime scanning after it.

-

+

class:tall

  • Contract → resolver → adapter → Checkov on static code (before plan) → terraform plan → Wiz on the plan → confidence signal → stage gate → apply → evidence + ledger
  • Fail-fast, quick feedback — Checkov runs on the authored Terraform code before terraform plan so developers get immediate policy feedback
  • Wiz on the plan when configured; Checkov as a drop-in otherwise — Wiz scans the plan output; when Wiz credentials are absent, Checkov runs against the plan. Wiz and Checkov are never both run on the plan.
  • -
  • Dev is autonomous (no stage gate); qa/prod/dr require human attestation (QA for quality, SRE for production readiness)

Benefit: two layers of scanning, zero operator involvement in normal operations — fast deterministic feedback at authoring time and a runtime scan on the resolved plan.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 7 — The Decision Ledger

+
+

Slide 8 — The Decision Ledger

Every automated decision is captured, immutable, queryable — and accountable.

  • What is captured: the chosen action, the confidence score, the alternatives considered, whether a human overrode it, and the outcome (backfilled once the apply completes). Every stage-gate attestation (QA, SRE) is captured with approver identity and the evidence presented.
  • @@ -175,10 +169,9 @@

    Benefit: "autonomous" is defensible because every decision is immutable, queryable, and accountable — and the audience knows exactly what "automated" means here: deterministic scoring, not a black-box LLM.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 8 — The Attestation Matrix

-

The designed controls that keep humans at stage gates — structured, freshness-validated, separation-of-duties-enforced.

+
+

Slide 9 — Attestation Matrix: QA

+

The designed controls that keep humans at stage gates — QA concerns, freshness-validated.

@@ -207,6 +200,24 @@ + +
24h The deployment's security findings have been reviewed and accepted.
+

Benefit: QA signs off on quality before any promotion — the gate is explicit, not implicit.

+
Nova — The Autonomous Cloud Delivery Platform
+
+
+

Slide 10 — Attestation Matrix: Prod/DR

+

Production and DR controls — operational readiness, resilience, and disaster recovery.

+ + + + + + + + + + @@ -255,37 +266,32 @@

Benefit: the gate model is explicit — autonomy in operations, human in accountability, by design. The matrix is what makes autonomous operations safe enough to trust in production.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 9 — Telemetry & Live Ops

+
+

Slide 11 — Telemetry & Live Ops

Every metric in this deck is traceable to a real emitted signal — the live-ops dashboard makes operations visible in PowerBI.

-

+

class:tall

  • Platform components → CloudEvents envelope → event log + decision ledger + run records → collector → cold store → PowerBI views → live ops dashboard
  • The live ops dashboard (PowerBI) surfaces the four CTO-grade metrics (Lead Time, Vulnerability Count, MTTR, Cloud Spend) alongside trust metrics (Decision Ledger coverage, Attestation coverage) and efficiency metrics (touchless resolution, escalation frequency)
  • -
  • Deliberately minimal — Nova-native envelopes; no Kafka, no Prometheus, no ClickHouse. The cold store handles batch and historical analysis; the live-ops surface is built in PowerBI on the exported views
  • Every number is traceable to a signal — when a CFO asks "where does this number come from?", the answer is a query against the cold store, not a Slack thread

Benefit: the architecture is the trust substrate — leadership sees the same numbers the platform produces, in PowerBI, with full traceability. Operations become visible.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 10 — Decision Ledger + Attestation Coverage

+
+

Slide 12 — Decision Ledger + Attestation Coverage

By design, no change reaches production without a ledger entry and a human attestation — both queryable for auditing, with full traceability.

  • Decision Ledger coverage: 100% — every platform run emits a decision record with outcome backfill; no automated decision is ever lost
  • Attestation coverage: 100% — every prod/dr promotion is attested by a human (QA for quality, SRE for production readiness), recorded with approver identity, separation-of-duties check, and the evidence matrix
  • No change to production without both — the ledger entry and the human attestation are mandatory, enforced by the pipeline, not by policy
  • -
  • Easily queried for auditing — queryable by run, by environment, by approver, and by outcome; the audit trail is a query, not a forensic exercise
  • Full traceability — a production change is traceable from the contract that declared intent, through the policy scan, the confidence score, the attestation, to the applied outcome

Benefit: trust is provable — not a marketing claim, a queryable record. An auditor answers "who approved this, when, on what evidence?" in one query; a CTO answers "how many of last quarter's prod changes were touchless?" in one query.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 11 — Cost & ROI

+
+

Slide 13 — Cost & ROI

The ROI formula and the cost estimates — grounded, with the production denominator honestly flagged.

  • Cost estimates are pre-apply and offline — the platform reads the terraform plan and estimates cost before anything is applied; a cost regression is caught before the spend happens
  • @@ -297,9 +303,8 @@

    Benefit: the ROI is not a black box — the formula is shown, the four metrics are committed, and the production-denominator caveat is stated up front. The CFO sees exactly what is real today and what activates with a pilot.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 12 — What's Deferred — and Why

+
+

Slide 14 — What's Deferred — and Why

Honesty about what is not measured yet — and the blocking work for each.

To be clear: these deferrals are measurement infrastructure, not the autonomy itself. The platform runs without an operator in the loop of normal operations. What is deferred is the evidence pipeline for certain metrics — not the autonomy.

ConcernEnvFreshnessDescription
Operational readiness prod
@@ -313,41 +318,31 @@ - + - - - - - - + - + - + - - - - - - + @@ -356,9 +351,8 @@

Benefit: the boundaries are explicit — what Nova measures today, and exactly what blocks the rest. The autonomy is real; the measurement gaps are documented with the work that unblocks each one.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 13 — Roadmap to the North Star

+
+

Slide 15 — Roadmap to the North Star

The path from the grounded metrics to the 12–18 month targets — each deferred metric has an unblock path and a timeframe.

1Live infrastructure healthLive infra health, outbox write rate, SLA Live AWS re-provisioning (currently torn down to zero-cost steady state)
2Live outbox write rateLive AWS re-provisioning
3 Tamper-evident ledger checkpoints Audit-ledger build-out (Object Lock + signed checkpoints)
43 Onboarding funnel (requested → granted) Auto-grant implementation
54 Drift auto-reversal Drift-detection scheduler (not yet built)
65 Live cost reconciliation Live AWS re-provisioning + actual-spend feed
7SLA / unplanned downtimeLive AWS re-provisioning
86 Predictive vs reactive ratio ML anomaly-forecasting service (not yet built)
@@ -405,9 +399,8 @@

Benefit: every deferred metric has an unblock path — nothing is hand-waved; everything has a plan and a timeframe.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 14 — 12-Month Product Roadmap

+
+

Slide 16 — 12-Month Product Roadmap

The product arc from pilot activation to integration — four quarters, four outcomes.

@@ -444,9 +437,8 @@

Benefit: the 12-month product arc — each quarter activates a strategic objective and its corresponding board-level metric, from pilot activation through integration leadership.

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 15 — Quarter-by-Quarter Outcomes

+
+

Slide 17 — Quarter-by-Quarter Outcomes

@@ -454,7 +446,6 @@ - @@ -463,28 +454,24 @@ - - - -
Product theme Key deliverable Target metricGrounding
Pilot Activation Re-provision live AWS; activate first pilot estate; onboarding auto-grant Touchless ≥ 99% · Escalation < 0.1% · Accuracy ≥ 99.5%Objective #1 — autonomy as the default
Q2 Provable Trust Tamper-evident ledger (Object Lock + signed checkpoints); daily checkpoints; live cost reconciliation Decision Ledger Coverage 100% · Cost Savings ≥ 25%Objective #2 — trust is the moat
Q3 Compounding ROI + Drift Drift-detection scheduler; auto-reversal; pre-apply → actual-spend reconciliation on the pilot estate Drift Auto-Reversal ≥ 95% · Spend Reduction ≥ 25%Objective #3 — CFO-pointable numbers
Q4 Integration + Predictive ML anomaly-forecasting; AI-agent intent surface; multi-cloud (Azure/GCP) preview Predictive:Reactive ≥ 3:1 · AI-Agent Intent Share (first measurement)Objective #4 — default substrate for agents
@@ -492,9 +479,8 @@

Benefit: each quarter has a concrete deliverable, a target metric grounded in a strategic objective, and a path from "honestly deferred" to "shipped and measured."

Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 16 — Production-Grade Guidance via Atelier (1/2)

+
+

Slide 18 — Production-Grade Guidance via Atelier (1/2)

Nova instructs the citizen developer's AI agent on production-grade engineering — a set of skills and an MCP server.

  • Skills — markdown files keyed to production-grade engineering domains (API, security, data, testing, observability, errors, DevOps, infrastructure-as-code, compliance); the skills extend the baseline catalog with Nova-specific production-grade principles
  • @@ -504,9 +490,8 @@

    Benefit: the citizen developer's AI agent is not unguided — Nova provides production-grade engineering principles as skills and as an MCP surface, so submissions arrive at the contract boundary already aligned with the platform's standards.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 17 — Production-Grade Guidance via Atelier (2/2)

+
+

Slide 19 — Production-Grade Guidance via Atelier (2/2)

Agentic validation catches engineering-discipline gaps that deterministic scanners miss — and the validation is reproducible.

  • Beyond deterministic scanners — Wiz, Checkmarx, and Mend check policy and secrets; they do not check engineering discipline. The Atelier MCP server catches correctness, clarity, and observability gaps that deterministic tools cannot: "is this service observable?", "is this error path handled?", "is this API contract clear?"
  • @@ -516,9 +501,8 @@

    Benefit: the citizen developer's submission is checked for engineering discipline, not just policy compliance — and the check is reproducible for audit. That is what makes the submission production-grade, regardless of which upstream platform produced it.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
-

Slide 18 — Recap + Ask

+
+

Slide 20 — Recap + Ask

The 4-beat recap + the business decision.

Recap:

    @@ -531,9 +515,7 @@

    Benefit: a clear business decision — approve a pilot and the ledger build-out — with the confidence that every claim in this deck is grounded, derived, or honestly deferred.

    Nova — The Autonomous Cloud Delivery Platform
-
-
Nova — The Autonomous Cloud Delivery Platform
- +

Appendix A1 — Metrics Glossary

diff --git a/docs/presentations/nova-autonomous-cloud-delivery.md b/docs/presentations/nova-autonomous-cloud-delivery.md index cfccac0..97ad9f6 100644 --- a/docs/presentations/nova-autonomous-cloud-delivery.md +++ b/docs/presentations/nova-autonomous-cloud-delivery.md @@ -98,10 +98,7 @@ operations.** --- -## Slide 3 — Strategic Objectives + Anti-Goals - -**Four objectives Nova is building toward; four anti-goals that keep it -focused.** +## Slide 3 — Strategic Objectives **4 Strategic Objectives:** 1. **Demonstrate production-grade zero-touch operations** — autonomy as @@ -128,7 +125,21 @@ focused.** to deploy to production go through the same rigorous controls, quality gates, attestation, and evidence stream. -**4 Anti-Goals (what Nova is NOT):** +> **Benefit:** the scope is explicit — Nova governs infrastructure and +> delivery, integrates with any upstream source through one validated +> contract, and measures success on four metrics a CTO can repeat back. + +> **Speaker notes:** Objective #2 is the one to land carefully: trust is +> established by deterministic scoring, not by an LLM. The platform +> functions without AI. + +> **Transition:** "The objectives are concrete — here is what Nova is +> NOT, to keep it focused." + +--- + +## Slide 4 — Anti-Goals (What Nova Is NOT) + 1. Not a general-purpose AI agent platform. 2. Not a system that removes humans from accountability — only from normal operations. @@ -136,13 +147,11 @@ focused.** authorship). 4. Not a replacement for the Product Development Lifecycle (PDLC). -> **Benefit:** the scope is explicit — Nova governs infrastructure and -> delivery, integrates with any upstream source through one validated -> contract, and measures success on four metrics a CTO can repeat back. +> **Benefit:** the boundaries are explicit — Nova is purpose-built for +> infrastructure operations and delivery, not a general-purpose AI agent +> or an upstream development platform. -> **Speaker notes:** Objective #2 is the one to land carefully: trust is -> established by deterministic scoring, not by an LLM. The platform -> functions without AI. Anti-goals #3 and #4 protect the scope boundary — +> **Speaker notes:** Anti-goals #3 and #4 protect the scope boundary — > Nova will not become an IDE or a product-planning tool. > **Transition:** "The scope boundary is explicit — here is exactly @@ -150,7 +159,7 @@ focused.** --- -## Slide 4 — Scope: Downstream of PDLC +## Slide 5 — Scope: Downstream of PDLC **Nova governs infrastructure and delivery. The PDLC is upstream — Nova never penetrates it. Integration is through one validated contract.** @@ -183,7 +192,7 @@ never penetrates it. Integration is through one validated contract.** --- -## Slide 5 — RACI: Who Owns What +## Slide 6 — RACI: Who Owns What **Four roles, one matrix — the citizen developer owns FRs + UAT, the platform owns NFRs + infra, quality engineering owns the gate evidence, @@ -224,7 +233,7 @@ and SRE owns operational readiness.** --- -## Slide 6 — The Platform Pipeline +## Slide 7 — The Platform Pipeline **How intent becomes verified infrastructure — with fail-fast policy scanning before the plan and runtime scanning after it.** @@ -272,7 +281,7 @@ graph LR --- -## Slide 7 — The Decision Ledger +## Slide 8 — The Decision Ledger **Every automated decision is captured, immutable, queryable — and accountable.** @@ -310,16 +319,42 @@ accountable.** --- -## Slide 8 — The Attestation Matrix +## Slide 9 — Attestation Matrix: QA -**The designed controls that keep humans at stage gates — structured, -freshness-validated, and separation-of-duties-enforced.** +**The designed controls that keep humans at stage gates — QA concerns, +freshness-validated.** | Concern | Env | Freshness | Description | |---------|-----|-----------|-------------| | Functional correctness | qa | 24h | The application behaves as specified; evidence accepted from the consumer's UAT. | | Performance baseline | qa | 7d | The deployment meets its performance envelope vs. the agreed baseline. | | Security posture | qa | 24h | The deployment's security findings have been reviewed and accepted. | + +- Each concern has a freshness window — evidence older than the window + does not satisfy the gate. +- Concerns that are offline-testable run for real; concerns that require + external evidence accept signed artifacts. + +> **Benefit:** QA signs off on quality before any promotion — the gate +> is explicit, not implicit. + +> **Speaker notes:** The matrix is not a rubber stamp. Each concern has a +> freshness window and a plain-language description of what is being +> attested. The "operator-supplied" label from the prior deck was +> dropped — every concern now has a plain-language description. + +> **Transition:** "QA is half the matrix — here are the production and +> DR controls." + +--- + +## Slide 10 — Attestation Matrix: Prod/DR + +**Production and DR controls — operational readiness, resilience, and +disaster recovery.** + +| Concern | Env | Freshness | Description | +|---------|-----|-----------|-------------| | Operational readiness | prod | 30d | SRE confirms the deployment is operable: runbooks, dashboards, on-call coverage. | | Incident response | prod | 90d | The on-call path has been exercised; the deployment has a working incident-response plan. | | Capacity & cost | prod | 30d | Capacity headroom and monthly cost are within the agreed envelope. | @@ -332,17 +367,16 @@ freshness-validated, and separation-of-duties-enforced.** does not satisfy the gate. - **Separation-of-duties on prod:** the approver cannot be the same person who built the deployment. -- Concerns that are offline-testable run for real; concerns that require - external evidence accept signed artifacts. > **Benefit:** the gate model is explicit — autonomy in operations, > human in accountability, by design. The matrix is what makes autonomous > operations safe enough to trust in production. -> **Speaker notes:** The matrix is not a rubber stamp. Each concern has a -> freshness window, a description, and a separation-of-duties rule. The -> "operator-supplied" label from the prior deck was dropped — every -> concern now has a plain-language description of what is being attested. +> **Speaker notes:** The prod/DR rows are the operational-readiness and +> resilience gates — SRE signs off on operability, incident response, +> capacity, and the three resilience checks (DR drill, chaos, backup). +> Separation-of-duties on prod is the rule that keeps the gate honest: +> the approver cannot be the same person who built the deployment. > **Transition:** "You've seen how Nova works — the pipeline, the ledger, > the attestation gates. Here is how Nova instruments itself so that @@ -350,7 +384,7 @@ freshness-validated, and separation-of-duties-enforced.** --- -## Slide 9 — Telemetry & Live Ops +## Slide 11 — Telemetry & Live Ops **Every metric in this deck is traceable to a real emitted signal — and the live-ops dashboard makes operations visible in PowerBI.** @@ -399,7 +433,7 @@ graph TB --- -## Slide 10 — Decision Ledger + Attestation Coverage +## Slide 12 — Decision Ledger + Attestation Coverage **By design, no change reaches production without a ledger entry and a human attestation — both queryable for auditing, with full @@ -435,7 +469,7 @@ traceability.** --- -## Slide 11 — Cost & ROI +## Slide 13 — Cost & ROI **The ROI formula and the cost estimates — grounded, with the production denominator honestly flagged.** @@ -466,7 +500,7 @@ denominator honestly flagged.** --- -## Slide 12 — What's Deferred — and Why +## Slide 14 — What's Deferred — and Why **Honesty about what is not measured yet — and the blocking work for each.** @@ -502,7 +536,7 @@ metrics — not the autonomy. --- -## Slide 13 — Roadmap to the North Star +## Slide 15 — Roadmap to the North Star **The path from the grounded metrics to the 12–18 month targets — each deferred metric has an unblock path and a candidate milestone.** @@ -533,7 +567,7 @@ deferred metric has an unblock path and a candidate milestone.** --- -## Slide 14 — 12-Month Product Roadmap +## Slide 16 — 12-Month Product Roadmap **The product arc from pilot activation to integration — four quarters, four outcomes.** @@ -560,7 +594,7 @@ integration) and the deferred-metric unblock paths. --- -## Slide 15 — Quarter-by-Quarter Outcomes +## Slide 17 — Quarter-by-Quarter Outcomes | Quarter | Product theme | Key deliverable | Target metric | Grounding | |---------|---------------|-----------------|---------------|-----------| @@ -587,7 +621,7 @@ anymore, and the audit trail is stronger than it ever was.'"* --- -## Slide 16 — Production-Grade Guidance via Atelier (1/2) +## Slide 18 — Production-Grade Guidance via Atelier (1/2) **Nova instructs the citizen developer's AI agent on production-grade engineering — a set of skills and an MCP server.** @@ -621,7 +655,7 @@ engineering — a set of skills and an MCP server.** --- -## Slide 17 — Production-Grade Guidance via Atelier (2/2) +## Slide 19 — Production-Grade Guidance via Atelier (2/2) **Agentic validation catches engineering-discipline gaps that deterministic scanners miss — and the validation is reproducible.** @@ -656,7 +690,7 @@ scanners miss — and the validation is reproducible.** --- -## Slide 18 — Recap + Ask +## Slide 20 — Recap + Ask **The 4-beat recap + the business decision.** @@ -710,4 +744,4 @@ S3 Object Lock + signed checkpoints. These two decisions move Nova from --- -> **End of deck.** 18 main slides + 1 appendix slide = 19 total. \ No newline at end of file +> **End of deck.** 20 main slides + 1 appendix slide = 21 total. \ No newline at end of file diff --git a/docs/presentations/nova-autonomous-cloud-delivery.pptx b/docs/presentations/nova-autonomous-cloud-delivery.pptx index 312fc64..4b2f85b 100644 Binary files a/docs/presentations/nova-autonomous-cloud-delivery.pptx and b/docs/presentations/nova-autonomous-cloud-delivery.pptx differ diff --git a/scripts/render_deck.sh b/scripts/render_deck.sh deleted file mode 100755 index b4fc068..0000000 --- a/scripts/render_deck.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -# scripts/render_deck.sh — render a Marp deck to HTML + PPTX, commit both to git. -# REQ-228 (v1.18): PPTX is now a first-class committed artifact + release attachment. -# -# Usage: -# bash scripts/render_deck.sh -# bash scripts/render_deck.sh nova-autonomous-cloud-delivery -# -# Renders: -# docs/presentations/-marp.md → docs/presentations/.html (committed) -# → docs/presentations/.pptx (committed, binary) -# -# The PPTX is also attached to the current phase's Gitea release via -# scripts/attach_release_asset.py (call separately after ship, or this script -# will invoke it if NOVA_GITEA_RELEASE_ID is set). -set -euo pipefail - -DECK="${1:?Usage: render_deck.sh }" -cd "$(git rev-parse --show-toplevel)" - -SRC="docs/presentations/${DECK}-marp.md" -HTML="docs/presentations/${DECK}.html" -PPTX="docs/presentations/${DECK}.pptx" - -if [ ! -f "$SRC" ]; then - echo "ERROR: source deck $SRC not found" >&2; exit 1 -fi - -CHROME="" -for c in \ - /root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \ - /usr/bin/chromium \ - /usr/bin/chromium-browser \ - /usr/bin/google-chrome; do - if [ -x "$c" ]; then CHROME="$c"; break; fi -done -if [ -z "$CHROME" ]; then - echo "WARNING: no Chrome/Chromium found — skipping render (HTML/PPTX will need manual re-render)" >&2 - exit 0 -fi -export CHROME_PATH="$CHROME" - -echo "Rendering HTML → $HTML" -npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$HTML" 2>&1 | tail -3 - -echo "Rendering PPTX → $PPTX" -npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$PPTX" 2>&1 | tail -3 - -git add "$HTML" "$PPTX" -echo "Staged $HTML + $PPTX for commit." - -if [ -n "${NOVA_GITEA_RELEASE_ID:-}" ]; then - echo "Attaching PPTX to Gitea release $NOVA_GITEA_RELEASE_ID..." - python3 scripts/attach_release_asset.py "$PPTX" "$NOVA_GITEA_RELEASE_ID" || \ - echo "WARNING: attach failed — PPTX is still committed; attach manually." -fi \ No newline at end of file diff --git a/scripts/render_slides.sh b/scripts/render_slides.sh index 7931f9b..4588c6a 100755 --- a/scripts/render_slides.sh +++ b/scripts/render_slides.sh @@ -41,16 +41,18 @@ if [ -z "$CHROME" ]; then fi export CHROME_PATH="$CHROME" -# --- Step 1: render mermaid diagrams (S&P-themed) --- -echo "=== Step 1: Rendering mermaid diagrams (S&P theme: $THEME_JSON) ===" +# --- Step 1: render mermaid diagrams (S&P-themed, 2x scale, transparent bg) --- +# REQ-258: -s 2 (2x scale) + -b transparent (transparent background) per README spec. +echo "=== Step 1: Rendering mermaid diagrams (S&P theme: $THEME_JSON, 2x, transparent) ===" if [ -d "$MMD_DIR" ]; then for mmd in "$MMD_DIR"/*.mmd; do name="$(basename "$mmd" .mmd)" png="$PNG_DIR/$name.png" echo " $name.mmd → $name.png" - npx --yes @mermaid-js/mermaid-cli \ + npx --yes @mermaid-js/mermaid-cli@11.16.0 \ --configFile "$THEME_JSON" \ --puppeteerConfigFile "$PUPPETEER_CFG" \ + -s 2 -b transparent \ --input "$mmd" \ --output "$png" 2>&1 | grep -v "^$" || true done @@ -61,13 +63,14 @@ fi echo "" # --- Step 2: render Marp deck (S&P-themed) --- +# REQ-257: pinned marp-cli version (v4.5.0) to prevent boilerplate-CSS drift. echo "=== Step 2: Rendering Marp deck → HTML + PPTX ===" echo " Theme: $THEME_CSS" echo " HTML → $HTML" -npx --yes @marp-team/marp-cli@latest --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$HTML" 2>&1 | tail -3 +npx --yes @marp-team/marp-cli@4.5.0 --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$HTML" 2>&1 | tail -3 echo " PPTX → $PPTX" -npx --yes @marp-team/marp-cli@latest --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$PPTX" 2>&1 | tail -3 +npx --yes @marp-team/marp-cli@4.5.0 --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$PPTX" 2>&1 | tail -3 echo "" # --- Step 3: stage --- diff --git a/scripts/sync_to_nova.sh b/scripts/sync_to_nova.sh index c83870e..ebd89e8 100755 --- a/scripts/sync_to_nova.sh +++ b/scripts/sync_to_nova.sh @@ -117,7 +117,6 @@ EXCLUDE_SCRIPTS=( sync_workflows.py attach_release_asset.py check_north_star_diff.sh - render_deck.sh render_slides.sh ) diff --git a/tests/test_no_forge_mentions.py b/tests/test_no_forge_mentions.py index 940bcce..c44c209 100644 --- a/tests/test_no_forge_mentions.py +++ b/tests/test_no_forge_mentions.py @@ -40,7 +40,7 @@ _EXCLUDE_SCRIPTS = { "untag_acdl_keys.py", "seed_uptime_monitors.py", "push_consumer_image.py", "sync_workflows.py", "attach_release_asset.py", "check_north_star_diff.sh", - "render_deck.sh", "render_slides.sh", + "render_slides.sh", } # Synced top-level files (not in any excluded dir). diff --git a/tests/test_slides_pipeline.py b/tests/test_slides_pipeline.py index 285053e..cda8202 100644 --- a/tests/test_slides_pipeline.py +++ b/tests/test_slides_pipeline.py @@ -13,7 +13,7 @@ v1.21 adds (REQ-245,251,252): - Deck renamed to nova-autonomous-cloud-delivery* - No maturity badges in the Marp deck - No version in the Marp footer/title slide - - 18 main + 1 appendix slides + - 20 main + 1 appendix slides (v1.22 split slides 3+8 to relieve overflow) - No D-###/REQ-###/internal .py paths in audience-facing slides - Title is "Nova — The Autonomous Cloud Delivery Platform" """ @@ -202,7 +202,9 @@ def test_marp_deck_title_is_autonomous_cloud_delivery(): def test_marp_deck_slide_count(): - """REQ-245: 18 main slides + 1 appendix = 19 slides total.""" + """REQ-245/261: 20 main slides + 1 appendix = 21 slides total. + v1.22 split slides 3 (Objectives+Anti-Goals) and 8 (Attestation + Matrix) to relieve overflow, increasing the count from 18 to 20.""" text = MARP_DECK.read_text() # Count slide separators: each slide ends with --- (except the last) # The frontmatter is one --- ... --- block, then each slide is separated by --- @@ -210,8 +212,8 @@ def test_marp_deck_slide_count(): slide_headings = re.findall(r"^## (?:Slide|Appendix) ", text, re.MULTILINE) main_slides = re.findall(r"^## Slide ", text, re.MULTILINE) appendix_slides = re.findall(r"^## Appendix ", text, re.MULTILINE) - assert len(main_slides) == 18, \ - f"expected 18 main slides, found {len(main_slides)}: {slide_headings}" + assert len(main_slides) == 20, \ + f"expected 20 main slides, found {len(main_slides)}: {slide_headings}" assert len(appendix_slides) == 1, \ f"expected 1 appendix slide, found {len(appendix_slides)}" @@ -265,4 +267,107 @@ def test_source_md_no_badges(): """REQ-252: no maturity badges in the source-of-truth markdown.""" text = SOURCE_MD.read_text() assert "badge" not in text.lower(), \ - "Source markdown still contains badge spans" \ No newline at end of file + "Source markdown still contains badge spans" + + +# --- v1.22 layout/aspect-ratio/theme-structural tests (REQ-262) --- + +def test_theme_css_has_section_padding(): + """REQ-254: theme CSS has a section padding rule (root cause fix).""" + css = THEME_CSS.read_text() + assert "padding:" in css, "theme CSS has no padding rule" + # The section rule must have padding (not just table/td padding) + assert re.search(r"section\s*\{[^}]*padding:", css, re.DOTALL), \ + "theme CSS has no padding on the section rule" + + +def test_theme_css_suppresses_title_chrome(): + """REQ-256: title slides suppress header/footer chrome.""" + css = THEME_CSS.read_text() + assert "section.title header" in css, \ + "theme CSS does not suppress title-slide header" + assert "section.title footer" in css, \ + "theme CSS does not suppress title-slide footer" + assert "display: none" in css, \ + "theme CSS does not set display:none on title chrome" + + +def test_theme_css_has_aspect_ratio_aware_images(): + """REQ-255: image rules use object-fit + max-width (not blunt max-height only).""" + css = THEME_CSS.read_text() + assert "object-fit" in css, \ + "theme CSS does not use object-fit for images" + assert "max-width" in css, \ + "theme CSS does not set max-width for images" + + +def test_png_aspect_ratios_sane(): + """REQ-259/260: PNGs referenced in the marp deck have aspect ratios + in [0.4, 4.0] (suitable for 16:9 slides with img.tall/img.wide classes). + Only checks PNGs actually referenced in the current marp deck — + legacy/unused PNGs are not checked (GRILL revision 1).""" + import struct + deck_text = MARP_DECK.read_text() + # Extract all referenced PNG paths: ![...](assets/png/X.png) + referenced = re.findall(r'!\[[^\]]*\]\(assets/png/([^)]+\.png)\)', deck_text) + assert referenced, "no PNGs referenced in the marp deck" + for png_name in referenced: + png_path = ASSETS / "png" / png_name + assert png_path.is_file(), f"referenced PNG not found: {png_name}" + with open(png_path, "rb") as fh: + data = fh.read(24) + assert data[:8] == b"\x89PNG\r\n\x1a\n", f"{png_name} is not a PNG" + w = struct.unpack(">I", data[16:20])[0] + h = struct.unpack(">I", data[20:24])[0] + ar = w / h + assert 0.4 <= ar <= 4.0, \ + f"{png_name} aspect ratio {ar:.2f} outside [0.4, 4.0] ({w}x{h})" + + +def test_render_slides_has_2x_scale(): + """REQ-258: render_slides.sh uses -s 2 (2x scale) and -b transparent.""" + text = RENDER_SCRIPT.read_text() + assert "-s 2" in text, "render_slides.sh does not use -s 2 (2x scale)" + assert "-b transparent" in text, \ + "render_slides.sh does not use -b transparent" + + +def test_render_slides_pins_cli_versions(): + """REQ-257: render_slides.sh pins marp-cli and mermaid-cli versions + (no @latest).""" + text = RENDER_SCRIPT.read_text() + assert "marp-cli@" in text, "render_slides.sh does not pin marp-cli" + assert "mermaid-cli@" in text, \ + "render_slides.sh does not pin mermaid-cli" + assert "@latest" not in text, \ + "render_slides.sh still uses @latest (not pinned)" + + +def test_render_deck_removed(): + """REQ-257: render_deck.sh has been deleted (produced unthemed output).""" + old_script = ROOT / "scripts" / "render_deck.sh" + assert not old_script.exists(), \ + "render_deck.sh still exists (should be deleted — produced unthemed output)" + + +def test_html_embeds_theme(): + """REQ-262: the committed HTML embeds the S&P theme (--sp-red + padding + in the inline