diff --git a/.ciagent/CHECKPOINT.json b/.ciagent/CHECKPOINT.json index 98d3ed6..351a067 100644 --- a/.ciagent/CHECKPOINT.json +++ b/.ciagent/CHECKPOINT.json @@ -1,6 +1,6 @@ { "phase": 0, - "stage": "plan", + "stage": "grill", "milestone": "v1.23", "phase_role": "pre_execution", "attempts": 0, diff --git a/.ciagent/PLAN.md b/.ciagent/PLAN.md index 7cf4be7..a380082 100644 --- a/.ciagent/PLAN.md +++ b/.ciagent/PLAN.md @@ -1,8 +1,21 @@ # PLAN — v1.23 (Nova Deck Cleanup & Python PPTX) > NFR milestone (docs/render/test only). Tags on v1.22.x line: -> v1.22.0 (P0) → v1.22.1..v1.22.5 (P1–P5) → v1.22.6 (P6 final = milestone -> release). 13 requirements (REQ-263..275), 7 phases. +> v1.22.0 (P0) → v1.22.1..v1.22.4 (P1–P4) → v1.22.5 (P5 final = milestone +> release). 13 requirements (REQ-263..275), 6 phases. +> +> **GRILL revisions applied** (G-001..G-004, conf 0.78-0.85): +> - G-001: "penetrate" purge covers the whole repo (`docs/` + +> `.ciagent/`), not just `docs/presentations/`. +> - G-002: P3→P4 serialized (not parallel) — P4's parser depends on +> P3's stable `render_slides.sh`; P4's trimmed deck is what P3b's +> parser consumes. +> - G-003: P3 split into P3a (inline_images + render_slides.sh + +> pyproject — low-risk) + P3b (render_pptx.py + parser + +> attach_release_asset.py — high-risk, isolated). +> - G-004: P5+P6 merged — NFR docs milestone; dedicated review/ship +> phase is ceremonial overhead. P5 absorbs review/audit/ship. Tag +> v1.22.5 = milestone release. ## Wave Ordering @@ -13,25 +26,26 @@ Wave 2 (P2): restore-clean-style (edits -marp.md frontmatter + ↓ benefit callouts; edits render_slides.sh; retires ↓ nova-sp-theme.css from render) ↓ -Wave 3 (P3 + P4, parallel): - P3: inline-images + python-pptx-generator (new scripts + - render_slides.sh step + pyproject; ZERO deck-markdown overlap) - P4: trim-wordcount + remove "penetrate" (edits -marp.md + - talking-points.md; ZERO script overlap with P3) +Wave 3 (P3a): inline-images (inline_images.py + render_slides.sh + ↓ step + pyproject — low-risk, mechanical) ↓ -Wave 4 (P5): ci-tests-readme (workflows, tests, README — - depends on all above) +Wave 4 (P3b): python-pptx-generator (render_pptx.py + parser + + ↓ attach_release_asset.py — high-risk, isolated) ↓ -Wave 5 (P6): final-review-ship (review + audit + milestone ship) +Wave 5 (P4): trim-wordcount + remove "penetrate" (edits -marp.md + + ↓ talking-points.md + docs/scope.md + docs/vision.md + + ↓ .ciagent/*.md "penetrate" purge) + ↓ +Wave 6 (P5): ci-tests-readme + review + audit + milestone ship + (merged P5+P6 per G-004) ``` -**Rationale (C8, conf 0.85):** P1→P2 is serial (both edit `-marp.md`; -P1 establishes the single doc, P2 edits its frontmatter). P3+P4 -parallelize: P3 owns `scripts/inline_images.py` + `scripts/render_pptx.py` -+ `scripts/render_slides.sh` + `pyproject.toml` + `scripts/attach_release_asset.py`; -P4 owns `docs/presentations/nova-autonomous-cloud-delivery-marp.md` + -`*-talking-points.md` — zero file overlap. P5 depends on all (tests -assert the final state). P6 is the final gate. +**Rationale (C8 revised by G-002/G-003/G-004):** P1→P2 serial (both +edit `-marp.md`). P3a→P3b serial (P3b's parser benefits from P3a's +stable `render_slides.sh`). P4 serial after P3b (P4's trimmed deck is +what P3b's parser must handle; P4's verify render depends on P3a's +stable script). P5 final (merged review/audit/ship per G-004 — NFR docs +milestone doesn't warrant a dedicated P6). --- @@ -149,15 +163,12 @@ assert the final state). P6 is the final gate. --- -## Phase P3 — inline-images + python-pptx-generator (tag v1.22.3) +## Phase P3a — inline-images (tag v1.22.3) -**Requirements:** REQ-268, REQ-269, REQ-270 -**Persona:** backend-engineer (scripts + pyproject) + lead-developer -(deck structure consultation) -**Branch:** `phase/03-inline-images-pptx` +**Requirements:** REQ-268 +**Persona:** backend-engineer (scripts + pyproject) +**Branch:** `phase/03a-inline-images` **Depends on:** P2 (render_slides.sh `--theme` drop) -**Parallel with:** P4 (zero file overlap — P3 owns scripts, P4 owns -deck markdown) ### Tasks @@ -174,7 +185,36 @@ deck markdown) - Writes HTML back in place; prints count inlined to stderr. - Usage: `python scripts/inline_images.py `. -2. **`scripts/render_pptx.py`** (REQ-269): +2. **`scripts/render_slides.sh`** (REQ-268): + - After Step 2 (MARP render), add Step 3: inline images into HTML + (`python scripts/inline_images.py "$HTML"`). + - Update Step 5 (stage): no change yet (python-pptx is P3b). + - Order now: Step 1 mermaid → Step 2 MARP HTML+PPTX → Step 3 inline + images → Step 4 stage. + +3. **Verify** (must-have): + - `bash scripts/render_slides.sh` produces `.html` with inlined + base64 images. + - Open the HTML from a different directory (no `assets/` folder) — + images display. + - `grep -c 'src="assets/' nova-autonomous-cloud-delivery.html` + returns 0 (all inlined). + - `grep -c 'data:image' nova-autonomous-cloud-delivery.html` + returns ≥2 (the deck's 2 images). + +--- + +## Phase P3b — python-pptx-generator (tag v1.22.4) + +**Requirements:** REQ-269, REQ-270 +**Persona:** backend-engineer (scripts + pyproject) + lead-developer +(deck structure consultation) +**Branch:** `phase/03b-python-pptx` +**Depends on:** P3a (stable render_slides.sh with inline step) + +### Tasks + +1. **`scripts/render_pptx.py`** (REQ-269): - Dependency: `python-pptx>=0.6.23` (import at module load; if absent, print "pip install -e .[slides]" and exit 1). - Parses `nova-autonomous-cloud-delivery-marp.md`: @@ -209,46 +249,43 @@ deck markdown) - Usage: `python scripts/render_pptx.py [deck-name]` (defaults to `nova-autonomous-cloud-delivery`). -3. **`pyproject.toml`** (REQ-269): +2. **`pyproject.toml`** (REQ-269): - Add to `[project.optional-dependencies]`: ```toml slides = ["python-pptx>=0.6.23"] ``` -4. **`scripts/render_slides.sh`** (REQ-268, REQ-270): - - After Step 2 (MARP render), add Step 3: inline images into HTML. +3. **`scripts/render_slides.sh`** (REQ-270): - Add Step 4: python-pptx render → `*-python.pptx`. - Update Step 5 (stage): add `*-python.pptx`. - Final order: Step 1 mermaid → Step 2 MARP HTML+PPTX → Step 3 inline images → Step 4 python-pptx → Step 5 stage. -5. **`scripts/attach_release_asset.py`** (REQ-270): +4. **`scripts/attach_release_asset.py`** (REQ-270): - Extend to accept multiple asset paths (both `.pptx` + `-python.pptx`). Backward-compatible (single arg still works; or accept a list). MARP PPTX is the primary attachment (first). -6. **Verify** (must-have): +5. **Verify** (must-have): - `bash scripts/render_slides.sh` produces 3 artifacts: `.html` (with inlined base64 images), `.pptx` (MARP), `-python.pptx` (structured). - - Open the HTML from a different directory (no `assets/` folder) — - images display. - Open `-python.pptx` — 16:9, title slide black with red bar, content slides with red titles + bullets + tables + images. - - `grep -c 'src="assets/' nova-autonomous-cloud-delivery.html` - returns 0 (all inlined). - - `grep -c 'data:image' nova-autonomous-cloud-delivery.html` - returns ≥2 (the deck's 2 images). + - `-python.pptx` is a valid zip (PPTX signature). --- -## Phase P4 — trim-wordcount (tag v1.22.4) +## Phase P4 — trim-wordcount + repo-wide "penetrate" purge (tag v1.22.5) **Requirements:** REQ-271, REQ-272 -**Persona:** lead-developer (deck markdown + talking-points) +**Persona:** lead-developer (deck markdown + talking-points + docs + +.ciagent) **Branch:** `phase/04-trim-wordcount` -**Depends on:** P1 (consolidated doc) -**Parallel with:** P3 (zero file overlap) +**Depends on:** P3b (stable render_slides.sh; trimmed deck is what P3b's +parser already handles — P4 does not break P3b's parser because the +parser handles the pre-trim structure and P4 trims prose, not +structure) ### Tasks @@ -273,31 +310,43 @@ deck markdown) - Benefit callouts (all slides): already restyled in P2; here just tighten each to one short sentence (preserve the spirit). -2. **Remove "penetrate"** (REQ-272): - - Slide 5 line 73: "Nova never penetrates it. Integration is through - one validated contract." → "Integration is through one validated - contract." (The "PDLC is upstream" bullet already conveys scope; - slide 4 Anti-Goals explicitly excludes the PDLC.) - - `nova-autonomous-cloud-delivery-talking-points.md:40`: "Nova never - penetrates it" → match slide 5's trimmed wording. - - The plain `.md` is already deleted (P1), so its `:165` "penetrate" - line is gone. +2. **Remove "penetrate" — repo-wide purge** (REQ-272, G-001): + - `docs/presentations/nova-autonomous-cloud-delivery-marp.md` slide 5: + "Nova never penetrates it. Integration is through one validated + contract." → "Integration is through one validated contract." + - `docs/presentations/nova-autonomous-cloud-delivery-talking-points.md:40`: + "Nova never penetrates it" → match slide 5's trimmed wording. + - `docs/scope.md`: reword "Nova never penetrates the PDLC" → + "Nova never reaches into the PDLC" (or restructure — the scope + boundary is already established by "downstream of PDLC"). + - `docs/vision.md`: reword "It does not penetrate upstream product or + software development lifecycles" → "It does not reach into upstream + product or software development lifecycles". + - `.ciagent/PROJECT.md`: reword the 3 "penetrate" occurrences in the + Core Tenets #2 + Scope sections. + - Note: `.ciagent/RESEARCH.md` + `.ciagent/PLAN.md` meta-references + to "penetrate removal" are NOT purged (they describe the removal; + purging them would erase the decision history). 3. **Verify** (must-have): - - `grep -ri penetrat docs/presentations/` returns nothing (text - files: .md, .html). + - `grep -ri penetrat docs/ .ciagent/PROJECT.md .ciagent/CLARIFY.md` + returns nothing (the term is gone from all audience-facing + + project-spec docs; RESEARCH.md/PLAN.md/GRILL.md meta-references + are exempt as decision-history). - Slide count unchanged (22). - `bash scripts/render_slides.sh` renders; no broken slides. - Word count of trimmed slides reduced ~20-30% (manual spot-check). --- -## Phase P5 — ci-tests-readme (tag v1.22.5) +## Phase P5 — ci-tests-readme + review + audit + ship (Final Phase, tag v1.22.6) -**Requirements:** REQ-273, REQ-274, REQ-275 -**Persona:** backend-engineer (CI + tests) + lead-developer (README) -**Branch:** `phase/05-ci-tests-readme` -**Depends on:** P1, P2, P3, P4 (asserts the final state) +**Requirements:** REQ-273, REQ-274, REQ-275 (+ review/audit/ship for all REQ-263..275) +**Persona:** backend-engineer (CI + tests) + lead-developer (README + review coordination) +**Branch:** `phase/05-ci-tests-readme-ship` +**Depends on:** P1, P2, P3a, P3b, P4 (asserts the final state; merged +P5+P6 per G-004 — NFR docs milestone doesn't warrant a dedicated +review/ship phase) ### Tasks @@ -325,8 +374,10 @@ deck markdown) - `test_source_md_*` → delete (plain `.md` is gone). - `test_render_slides_pins_cli_versions` → keep, extend to assert `python-pptx` is in `pyproject.toml`. - - `test_no_penetrate_term` (new): assert - `grep -ri penetrat docs/presentations/` returns nothing. + - `test_no_penetrate_term` (new, G-001): assert + `grep -ri penetrat docs/ .ciagent/PROJECT.md .ciagent/CLARIFY.md` + returns nothing (RESEARCH.md/PLAN.md/GRILL.md meta-references + exempt as decision-history). - `test_html_images_inlined_as_base64` (new): assert rendered HTML has zero `src="assets/` references and ≥1 `data:image/png;base64` per image the deck uses. @@ -365,34 +416,17 @@ deck markdown) - Document the dual-PPTX output (MARP image-of-slide primary + python structured for comparison/editing). -4. **Verify** (must-have): - - `pytest tests/test_slides_pipeline.py tests/test_pptx_generator.py` - all pass. - - CI workflow YAML is valid. - - README reflects the new pipeline. - ---- - -## Phase P6 — final-review-ship (Final Phase, tag v1.22.6) - -**Requirements:** all (REQ-263..275) -**Persona:** lead-developer (review coordination) -**Branch:** `phase/06-final-review-ship` -**Depends on:** P1–P5 - -### Tasks - -1. **Multi-persona code review** (`ciagent-review`): +4. **Multi-persona code review** (`ciagent-review`): - Review all changes in `milestone/v1.23-deck-cleanup-python-pptx`. - Auto-apply P0 fixes; flag P1+ for post-hoc review. - If P1+ found: fix in this phase. -2. **Audit** (`ciagent-audit`): +5. **Audit** (`ciagent-audit`): - Reconstruction test: git log matches `.ciagent/` files. - `.ciagent/` file discipline + branch hygiene + commit discipline. -3. **Ship** (`ciagent-ship` — milestone ship): - - Merge `phase/06` → `milestone/v1.23-deck-cleanup-python-pptx`. +6. **Ship** (`ciagent-ship` — milestone ship): + - Merge `phase/05` → `milestone/v1.23-deck-cleanup-python-pptx`. - Merge `milestone/v1.23-deck-cleanup-python-pptx` → `main`. - Tag `v1.22.6` (final patch = milestone release). - Create release with full milestone summary (all phases, all 13 @@ -401,20 +435,28 @@ deck markdown) - Delete all milestone branches (local + remote). Tags preserve history. -4. **Complete the milestone**: +7. **Complete the milestone**: - Update `REQUIREMENTS.md` — mark all v1.23 requirements complete. - Update `ROADMAP.md` — mark v1.23 complete. - Commit: `docs(milestone): complete v1.23 — Nova Deck Cleanup & Python PPTX`. +8. **Verify** (must-have): + - `pytest tests/test_slides_pipeline.py tests/test_pptx_generator.py` + all pass. + - CI workflow YAML is valid. + - README reflects the new pipeline. + --- ## Versioning - NFR milestone → progressive patches on v1.22.x line. -- `v1.22.0` (P0) → `v1.22.1..v1.22.5` (P1–P5) → `v1.22.6` (P6 final = - milestone release). No separate minor tag. +- `v1.22.0` (P0) → `v1.22.1` (P1) → `v1.22.2` (P2) → `v1.22.3` (P3a) → + `v1.22.4` (P3b) → `v1.22.5` (P4) → `v1.22.6` (P5 final = milestone + release). No separate minor tag. 6 phases total (was 7; P5+P6 merged + per G-004, P3 split into P3a+P3b per G-003). -## Risk Mitigations (from RESEARCH) +## Risk Mitigations (from RESEARCH + GRILL) 1. **Default theme padding** — explicitly set `section { padding: 48px 56px 40px }` in the inline `style:` block @@ -428,4 +470,9 @@ deck markdown) slides but they persist in the source `-marp.md` (acceptable; they're for authors, not the audience). 5. **`test_html_embeds_theme`** — update to assert literal `#D6002A` - (not `--sp-red`). \ No newline at end of file + (not `--sp-red`). +6. **P3b parser overflow** (G-003) — isolated in its own phase so a + parser setback doesn't block inline-images (P3a) or trim (P4). +7. **"penetrate" purge scope** (G-001) — repo-wide, not just + `docs/presentations/`; RESEARCH.md/PLAN.md/GRILL.md exempt as + decision-history. \ No newline at end of file diff --git a/.ciagent/REQUIREMENTS.md b/.ciagent/REQUIREMENTS.md index 72ebb1a..5a1cb2e 100644 --- a/.ciagent/REQUIREMENTS.md +++ b/.ciagent/REQUIREMENTS.md @@ -2020,9 +2020,9 @@ assert 20 main + 1 appendix. | REQ-265 | P2 | pending | | REQ-266 | P2 | pending | | REQ-267 | P2 | pending | -| REQ-268 | P3 | pending | -| REQ-269 | P3 | pending | -| REQ-270 | P3 | pending | +| REQ-268 | P3a | pending | +| REQ-269 | P3b | pending | +| REQ-270 | P3b | pending | | REQ-271 | P4 | pending | | REQ-272 | P4 | pending | | REQ-273 | P5 | pending | diff --git a/.ciagent/ROADMAP.md b/.ciagent/ROADMAP.md index cbad3c1..ccbcb47 100644 --- a/.ciagent/ROADMAP.md +++ b/.ciagent/ROADMAP.md @@ -2100,7 +2100,10 @@ release). **DONE.** ### Phase P0 — pre-execution (active) - SPECIFY → CLARIFY → RESEARCH → PLAN → GRILL. Establishes v1.23 - requirements (REQ-263..275). Tag `v1.22.0`. + requirements (REQ-263..275). Tag `v1.22.0`. Grill PROCEED-WITH- + REVISIONS (0.78): 4 binding revisions applied (G-001 repo-wide + "penetrate" purge; G-002 P3→P4 serialized; G-003 P3 split P3a+P3b; + G-004 P5+P6 merged). ### Phase P1 — consolidate-docs (planned, tag v1.22.1) - REQ-263: fold speaker notes + talking points into `*-marp.md` as Marp @@ -2118,24 +2121,28 @@ release). **DONE.** - REQ-267: restyle benefit callouts — remove `**Benefit:**` prefix; use `.benefit` class (red top-rule + black italic; white on title slides). -### Phase P3 — inline-images + python-pptx-generator (planned, tag v1.22.3) +### Phase P3a — inline-images (planned, tag v1.22.3) - REQ-268: new `scripts/inline_images.py` — base64-embeds all images in the rendered HTML for redistribution. Invoked after the MARP HTML - render. + render. Low-risk, mechanical (G-003 isolation). + +### Phase P3b — python-pptx-generator (planned, tag v1.22.4) - REQ-269: new `scripts/render_pptx.py` — structured, editable, S&P-themed PPTX via `python-pptx`. 16:9; native tables; embedded PNGs; benefit - callouts. Add `python-pptx` to `pyproject.toml`. + callouts. Add `python-pptx` to `pyproject.toml`. High-risk, isolated + (G-003). - REQ-270: `render_slides.sh` produces both PPTX outputs; CI installs `python-pptx`; both attached to release. -### Phase P4 — trim-wordcount (planned, tag v1.22.4) +### Phase P4 — trim-wordcount + repo-wide "penetrate" purge (planned, tag v1.22.5) - REQ-271: targeted ~20-30% word-count trim on verbose slides (1, 5, 7, 8, 13, 14, 20, appendix). Tables untouched. Spirit preserved. -- REQ-272: remove "penetrate" (and derivatives) from all presentation - files. Slide 5's phrase removed with no replacement (slide 4 - already excludes the PDLC). +- REQ-272: remove "penetrate" (and derivatives) repo-wide (G-001) — + `docs/` + `.ciagent/PROJECT.md`/`CLARIFY.md`; RESEARCH.md/PLAN.md/ + GRILL.md exempt as decision-history. Slide 5's phrase removed with no + replacement (slide 4 already excludes the PDLC). -### Phase P5 — ci-tests-readme (planned, tag v1.22.5) +### Phase P5 — ci-tests-readme + review + audit + ship (Final Phase, tag v1.22.6) - REQ-273: CI workflows install `python-pptx`, run `render_slides.sh`, commit HTML + both PPTX + inlined images. - REQ-274: update `test_slides_pipeline.py` (consolidated doc, inline @@ -2143,10 +2150,7 @@ release). **DONE.** "penetrate" absence). New `test_pptx_generator.py`. - REQ-275: rewrite `README.md` for the single-document + dual-PPTX + image-inlining pipeline. - -### Phase P6 — final-review-ship (Final Phase, planned, tag v1.22.6) -- Multi-persona code review across all phases. -- Audit: git log matches `.ciagent/` discipline. -- Ship: tag `v1.22.6` (final patch = milestone release). Merge +- Review + audit + milestone ship (merged P5+P6 per G-004 — NFR docs + milestone). Tag `v1.22.6` (final patch = milestone release). Merge `milestone/v1.23-deck-cleanup-python-pptx` → `main`. - **Requirements:** REQ-263..275 (13 requirements).