166 lines
39 KiB
Markdown
166 lines
39 KiB
Markdown
# Roadmap
|
||
|
||
[English](./roadmap.md) | [Chinese](./zh/roadmap.md)
|
||
|
||
---
|
||
|
||
> PPT Master is a solo-maintained open source project, driven by **priority rather than fixed timelines**. This roadmap is here to align expectations: what's already shipped, what's under ongoing maintenance and evolution, and what's intentionally out of scope. Priorities shift with user feedback and real usage signals — no committed delivery windows.
|
||
>
|
||
> **Where we are**: AI generates SVG from scratch → converts to DrawingML for natively editable PPTX. The core axis is **pixel-fidelity across four renderers** (PowerPoint / Keynote / LibreOffice / WPS) **+ real native shapes**. Every direction below serves that axis.
|
||
|
||
---
|
||
|
||
## Recent capability evolution
|
||
|
||
The past two months' structural capability growth. Single flags / incremental polish go to the commit log.
|
||
|
||
### 2026-03 — Native PPTX route takes shape
|
||
|
||
- **Direct export to natively editable PPTX** — `svg_to_pptx` adds glow / rotate / text-decoration / stroke-linejoin; the full SVG → DrawingML chain becomes usable
|
||
- Chart / layout template JSON indexes ship, AI selection path connected
|
||
|
||
### 2026-04 — Pipeline at scale
|
||
|
||
- **Source-less generation**: `topic-research` workflow supports "topic only, no source files"
|
||
- **PPTX export step-change**: SVG clipPath → DrawingML picture geometry, marker → native arrows, output consolidated to `exports/`
|
||
- **Chart library expands to 70 templates + three icon libraries** (simple-icons / phosphor-duotone / brand-logo)
|
||
- **`spec_lock.md` machine-readable contract**: Strategist locks the spec, Executor re-reads it before every page — cross-page consistency gets a real guarantee
|
||
- **Per-element animation support** + recorded narration / video export ([`workflows/generate-audio.md`](../skills/ppt-master/workflows/generate-audio.md)); the current behavior is opt-in, with element animation defaulting to `none`
|
||
|
||
### 2026-05 — Visual editing + AI image systematization
|
||
|
||
- **Live Preview enters the main pipeline** ([`workflows/live-preview.md`](../skills/ppt-master/workflows/live-preview.md)) — browser preview, click elements to write annotations, say "apply my annotations" and the AI rewrites that region (built on [@WodenJay](https://github.com/WodenJay)'s [PR #85](https://github.com/hugohe3/ppt-master/pull/85))
|
||
- **Replicate any PPTX as a template** ([`workflows/create-template.md`](../skills/ppt-master/workflows/create-template.md)) — PPTX → SVG reverse + OOXML theme / master / layout / asset extraction
|
||
- **AI image three-dimension system** rendering × palette × type + Strategist h.5 lock, downstream consumes a fixed contract
|
||
- **AI image `hero_page` dual-track** — local insert + full-canvas hero image coexist
|
||
- **Brand identity preset subsystem** ([`workflows/create-brand.md`](../skills/ppt-master/workflows/create-brand.md)) — extract and reuse brand palette / typography / logo / voice
|
||
- **Visual self-review workflow** ([`workflows/visual-review.md`](../skills/ppt-master/workflows/visual-review.md)) — rubric-based per-page check of AI-generated SVGs
|
||
- **AI image: Type concept boundary clarification** — Type is now narrowed to "the internal geometric skeleton of a local infographic block" (11 real skeletons); the four pseudo-types (hero / background / portrait / typography) fold back into `page_role: hero_page` plus four composition primitives (single-subject / portrait / typographic / atmospheric); hero_page text layering rule (visual keywords embedded, editable text via SVG overlay)
|
||
- **Brutalist AI newspaper example deck shipped** ([`examples/ppt169_brutalist_ai_newspaper_2026/`](../examples/ppt169_brutalist_ai_newspaper_2026/)) — first of the three P0 capability-backing demos: wall-to-wall small type + irregular columns + halftone monochrome + single-spot red + real native shapes; 10-page editorial annual report stressing text-position precision and cross-page consistency
|
||
- **Kubernetes Blueprint example deck shipped** ([`examples/ppt169_kubernetes_blueprint_2026/`](../examples/ppt169_kubernetes_blueprint_2026/)) — second of the three P0 capability-backing demos: isometric technical-drawing aesthetic + blueprint cyan/amber palette + hand-authored SVG geometry (no raster images) + custom drawing-in animation; 10-page Kubernetes architecture walkthrough stressing geometric shape generalization and chart-structure extensibility
|
||
- **AI image `custom` escape hatch** — `rendering` / `palette` / hero composition each accept `custom` + a one-paragraph `*_behavior` prose, replacing the false "default to vector-illustration / cool-corporate" fallback; end-to-end contract spans [`image-renderings/_index.md`](../skills/ppt-master/references/image-renderings/_index.md) §1.5, [`image-palettes/_index.md`](../skills/ppt-master/references/image-palettes/_index.md) §2, Strategist h.5 hard-rule (≤1 custom per dimension; one candidate may carry both), spec_lock fields, and Image_Generator Step 2 consumption branch
|
||
- **Template architecture: three-kind consolidation** ([`docs/templates-architecture.md`](./templates-architecture.md)) — brand / layout / deck split into three independent dirs with per-kind schemas + segment-level fusion + git-style conflict resolution; SKILL.md Step 3 dispatches per `kind`, trigger rule remains "explicit path only"
|
||
- **Pattern fill PPTX safety net** — `svg_quality_checker.py` now warns on `<pattern>` without `data-pptx-pattern` (silent fallback to `ltUpDiag`) and errors on values outside OOXML `ST_PresetPatternVal` (schema-failed PPTX that won't open); `shared-standards.md §7` documents the closed preset enum and color resolution from importer metadata or child paint
|
||
- **LaTeX math formula rendering shipped** ([`scripts/latex_render.py`](../skills/ppt-master/scripts/latex_render.py)) — Strategist locks one of three policies (`mixed` / `render-all` / `text-only`) inside the Typography confirmation and writes an explicit `images/formula_manifest.json`; the renderer walks a codecogs → quicklatex → mathpad → wikimedia fallback chain and emits transparent PNGs that land in §VIII as `Acquire Via: formula` / `Status: Rendered` rows; formula-heavy decks (academic / engineering / educational) finally have a native rendering route. Formula selection is a Strategist decision — the renderer never scans source files for `$...$` markers
|
||
- **Live preview direct editing — L1 / L2 / L3** ([`workflows/live-preview.md`](../skills/ppt-master/workflows/live-preview.md)) — the browser editor gains deterministic in-place edits with no AI round-trip: text content (L1), presentation attributes like fill / stroke / font-size (L2), and on-canvas geometry (L3) — drag a selected element to move it, arrow-key nudge (`Shift` = 10px), multi-select, plus a right-click overlap picker for stacked shapes. Edits stage with `Ctrl+Z` undo + coalescing and write to `svg_output/` on **Apply changes**; moves persist through finalize / export (moved text frames, promoted multi-line tspans, repositioned icons all reproduce in the PPTX). Re-export stays chat-driven; on-canvas resize handles are not yet implemented (resize via the geometry inputs)
|
||
|
||
### 2026-06 — Mode & visual-style dual catalogs + PPTX intake & content-strategy expansion
|
||
|
||
- **Replicate any PPTX's design → refill content route** ([`workflows/template-fill-pptx.md`](../skills/ppt-master/workflows/template-fill-pptx.md)) — when a user supplies an existing `.pptx` plus new material / a topic and asks to "reuse this deck's design / fill the content back in", this standalone workflow edits the PPTX directly and never enters the SVG generation pipeline. Output stays natively editable (it reuses the original slides' shapes / layouts, not a screenshot refill); it isolates private parts on reuse, exposes chart data, and runs capacity checks. Trigger follows the template rule — only on an explicit ask to reuse an existing deck — and it deliberately does not reflow / add pages / swap images (that's the from-scratch main route). Distinguished from Non-goals #53 below
|
||
- **Three executors retired → mode + visual-style dual catalogs** ([`references/modes/`](../skills/ppt-master/references/modes/) + [`references/visual-styles/`](../skills/ppt-master/references/visual-styles/)) — the old three `executor-*.md` (general / consultant / consultant-top) entangled domain · audience · persuasion · narrative on one axis; split into two orthogonal catalogs (following the `image-renderings` pattern: flat dir + `_index` + on-demand read + Strategist locks one). **mode** = narrative skeleton (`pyramid` / `narrative` / `instructional` / `showcase`; consultant + top merge into pyramid since their narrative core is identical); **visual-style** = SVG layout aesthetic (`swiss-minimal` / `editorial` / `soft-rounded` / `dark-tech`, each paired with an image-rendering, **zero HEX** — color truth stays in confirmation e + image-palettes). Strategist `§d` locks `mode` + `visual_style` independently into `spec_lock`; Executor loads the two locked files; any mode × any style. Render coordinates stay in `templates/charts/`
|
||
- **Prompt constraint-strength decoupling** ([`docs/rules/prompt-style.md`](rules/prompt-style.md) §4) — three explicit strength tiers — rule (`Hard rule` / `Forbidden`) / default (`Default — … may override`) / reference (`Reference — not a constraint`) — plus an "objective failure vs taste" test and a checker boundary, so the model can tell "must keep vs may deviate" at a glance; the visual-style catalog is Reference-strength throughout
|
||
- **visual-style catalog grows to 18, aligned with image-renderings + examples reclaimed** — first four distilled from the [examples library](../examples/) (`brutalist` / `blueprint` / `memphis` / `zine`), then six filling in the hand-drawn / textured renderings that have a layout twin (`sketch-notes` / `ink-notes` / `chalkboard` / `paper-cut` / `vintage-poster` / `pixel-art`), then four more reclaimed from still-uncovered example aesthetics: `ink-wash` (rice-paper whitespace, from Cangzhuo / Li Ziqi) · `glassmorphism` (dark frosted-glass + gradient light, from glassmorphism_demo, split out of soft-rounded) · `photo-editorial` (full-bleed photography dominates, text captions, from Pritzker / fashion_weekly) · `data-journalism` (Bloomberg/Economist multi-column micro-charts + sidebars, from global_ai_capital). The catalog is regrouped into five families (corporate-product / editorial-publication / expressive-print / hand-drawn-brush / specialty). **The test**: a rendering earns a visual-style twin only when it defines a whole-page layout language, not merely how an inserted image looks — so photo-*led composition* gets `photo-editorial` (paired with corporate-photo), while purely atmospheric renderings (nature / warm-scene / fantasy-animation) stay imagery-only and just pair with a layout style. Zero HEX, Reference strength throughout
|
||
- **mode catalog grows to 5: add `briefing`** — fills the "neutral information delivery" cell: no thesis, no story, no teaching, no spectacle — topic titles, even weight, complete and scannable, for status updates / reference decks / catalogs / meeting packs / FAQs that inform without arguing. The five now partition presentation *intent* more nearly MECE: persuade (pyramid) · tell a story (narrative) · teach (instructional) · impress (showcase) · simply inform (briefing). `_index` gains a `briefing` vs `pyramid` tie-breaker ("if you'd have to invent a thesis to fit pyramid, it's briefing"). Five presets plus a `custom` escape hatch for a bespoke direction none of them captures (a special cadence, a multi-mode fusion, a particular posture) — either user-requested or Strategist-recommended, confirmed like every lock; a deck always locks one value, and a fusion is one `custom` describing the acts. The only thing to avoid is defaulting to `custom` when a preset genuinely fits. Mirrors the truth-precedence rule that a user-authored outline or direction overrides the mode
|
||
- **mode / visual-style system validated on real decks + four calibration tightenings landed** — the 5 modes + 18 visual-styles + the `custom` escape hatch were exercised on five covering decks (briefing×data-journalism / narrative×photo-editorial / instructional×chalkboard / showcase×glassmorphism / custom×zine, with the narrative deck going through the AI-image branch): **zero selection misses** (all four Close-calls tie-breakers fired and held against the real grey-zone pulls), **discipline fully honored** (zero HEX / Reference strength / whole-page layout language), **the `custom` mechanism works** (a `mode_behavior` prose paragraph carried a 10-page generation and reads as plain language at confirmation, not a bare token), **mode ⟂ visual_style holds** (any combination without bleed, including a positive check of the "keynote/launch = mode not style" route), export 5/5 decks × every page with 0 failures. Tightened four spots from the real signal: `strategist §e` now locks the full neutral tier set the visual_style implies up front (killing the mid-deck color top-ups seen in three consecutive decks), `executor-base §1` re-skins chart/layout template gradients-shadows-fills to the deck's visual_style (templates supply structure, not skin; mirror templates retain their declared prototype paint per §1.1), `briefing §1` makes `core_message` state coverage rather than a claim (briefing-only; global §IX assertion semantics stay for narrative/instructional/pyramid), and `svg_quality_checker` fixes font-family drift false positives (delimiter-matched capture + stack normalization) and drops the font-size ceiling for showcase mode and poster visual-styles
|
||
- **Optional spec-review checkpoint shipped** ([`workflows/refine-spec.md`](../skills/ppt-master/workflows/refine-spec.md)) — an opt-in pause after the Strategist confirmation stage: when the user explicitly asks (default OFF), the Strategist produces the full `design_spec.md` + `spec_lock.md`, then stops so the user can revise any part of the spec (outline / color / typography / layout / image strategy / page rhythm) before generation, keeping both files in sync. Same shape as the split-mode note — it never fires on its own, the default pipeline is unchanged, and it surfaces as one opt-in line inside the Strategist confirmation stage. Review lenses (logical clarity / information density / focus / register / emotional resonance / chapter balance + the design dimensions) give a direction only, never a numeric threshold (`Reference` strength). Prompted by [@cuberoocp](https://github.com/cuberoocp) in [issue #173](https://github.com/hugohe3/ppt-master/issues/173)
|
||
- **Interactive visual Strategist confirmation stage page (Step 4)** ([`scripts/confirm_ui/server.py`](../skills/ppt-master/scripts/confirm_ui/server.py), field schema [`scripts/docs/confirm_ui.md`](../skills/ppt-master/scripts/docs/confirm_ui.md)) — the Strategist confirmation stage moves from chat-only to a browser page that auto-launches by default at Step 4. Template adherence appears only for deck/layout templates and defaults to `adaptive`: every page still maps to the template architecture, while unmatched compositions may create a new explicit Layout under the same Master. `strict` keeps the selected Layout contracts unchanged. The page shares port `5050` with Live Preview and writes authoritative choices to `result.json`.
|
||
- **A batch of source-conversion fidelity gains** — less information dropped as source material enters the pipeline: `doc_to_md` converts Word OMML / Office Math equations to inline LaTeX, `pdf_to_md` recognizes `Figure N |` pipe-delimited captions, and `ppt_to_md` preserves hyperlinks already in the source deck (run-level external `[text](url)` / slide-internal jumps `[text](#slide-N)` / shape-level clicks, with dangerous-scheme filtering and anchor-text Markdown escaping) and transcribes native chart data into Markdown tables (values survive the conversion instead of collapsing to a single picture). Caption recognition is based on [@suay1113](https://github.com/suay1113)'s [PR #191](https://github.com/hugohe3/ppt-master/pull/191); hyperlink preservation is distilled from [@ZhaoZuohong](https://github.com/ZhaoZuohong)'s [PR #155](https://github.com/hugohe3/ppt-master/pull/155)
|
||
|
||
- **Content-faithful PPT beautification / re-layout shipped** ([`workflows/beautify-pptx.md`](../skills/ppt-master/workflows/beautify-pptx.md)) — mirror of `template-fill`: template-fill reuses a deck's design with new content, beautify keeps the content and redoes the layout. Given an existing PPTX, **every text string is preserved verbatim (nothing added / removed / reworded)**; it **extracts and inherits the source deck's visual identity (palette / fonts, `theme` or `observed` offered as two confirm-page candidates)** and redoes only layout / hierarchy / whitespace, strict 1:1 page count and order, with charts / tables regenerated natively from extracted data (values frozen) and source pictures re-laid-out. Technically still "generate a native, editable PPTX from scratch" (`ppt_to_md` extracts content → main pipeline → a brand-new deck), not a patch over the original, so it stays clear of Non-goals #53. Adds `beautify_identity.py` / `beautify_inventory.py`; the confirm page is seeded from the source for the user to review. Honest v1 ceiling: it does not relieve information overload (a crowded page improves within itself; true re-pagination is the main pipeline), does not guarantee coordinate-level paste-back, and combo / dual-axis / waterfall charts lose the un-captured plots
|
||
|
||
- **Multi-deck PPTX intake + `analysis/` source-name prefixing** — a main-pipeline project can now combine several source decks: each writes its own `<stem>.identity.json` / `<stem>.slide_library.json`, with every deck's digest inlined under `decks[]` in the single index `source_profile.json` (preserving the "Strategist must-read `source_profile.json`" single-entry contract — one entry for a one-deck project, several for a combined one; re-importing the same stem replaces its entry). `beautify` / `template-fill` stay single-deck (1:1) and read their own `<stem>.*` artifacts
|
||
|
||
- **Material divergence (a free-text field under §c Audience)** — a main-pipeline content-strategy question added as a **free-text box** under the audience field: the user states in their own words how closely to follow the source vs how freely to reshape it (blank = balanced default). Deliberately not a fixed set of options, not recommended from analyzing the source, and not coupled to page count — it is purely the user's stated intent. However freely they ask, facts **stay sourced** — reorganize / reframe / expand / connect what is in the source, never import facts from outside it (that is the `topic-research` job). The Strategist reads the prose when authoring the §IX outline and records it in `design_spec §I`; it is **not** written to `spec_lock` (the Executor never reads it). `mode` and divergence are orthogonal. Beautify / template-fill freeze content and do not surface this field
|
||
|
||
- **A batch of default-behavior and intake standardizations** — per-element entrance animation now defaults off (page transition `fade` only; element builds are opt-in via `-a auto` / `animations.json`), removing the auto-cascade "AI deck" tell; per-project `icons/` copies chosen icons into the project at selection time and embeds project-first; `analysis/` is established as the canonical must-read layer for machine-extracted facts (PPTX intake bundle + `image_analysis.csv`); the main pipeline treats a source deck's identity (palette / fonts / layout) as **reference, not constraint** (inherit or redesign by Strategist judgment, defaulting to fresh design); the confirm page gains a custom color input
|
||
|
||
- **AI illustration sheet → sliced spot-illustration pipeline** ([`scripts/slice_images.py`](../skills/ppt-master/scripts/slice_images.py)) — when a deck wants several spot illustrations of one family, instead of one AI call per cell it **generates a single multi-cell illustration sheet** (one call locks the whole set's style / palette and costs far less than per-cell generation), then `slice_images.py` deterministically cuts it on an `RxC` grid into individual element files; `--trim` tight-crops to each cell's content bounding box and `--alpha` knocks out the flat background, so each element lands as a **transparent cutout** on a differently-colored page rather than a visible box. Two §VIII resource rows make this explicit: one `ai` Illustration Sheet (generated but never placed directly, kept out of `spec_lock.md` images) plus one `slice` element row per cell (actually placed, listed in spec_lock); Step 5 generates the sheet, slices it, and re-runs `analyze_images`, and the Step 7 readiness gate handles the offline case by listing the sheet + element targets for the user to place and re-slice. Whether the deck uses spot illustrations is a Strategist judgment within the `image_usage` source boundary (not a separate confirm field; `image_usage: none` always wins over illustration intent); users never see the internal sheet/slice implementation. `svg_quality_checker` gains matching validation, and [`image-layout-patterns.md`](../skills/ppt-master/references/image-layout-patterns.md) adds image-led promotional layout patterns
|
||
|
||
- **Spot illustrations: from "can be sliced" to "used well, as a system"** — a decision layer on top of the slice pipeline plus edge-quality hardening, so a deck actually uses illustration well rather than merely being able to generate it. ① **Slice quality**: `slice_images.py` `--alpha` now uses a feathered soft mask (anti-aliased + 1px defringe), samples the background from a 2px border-ring median, and measures color distance as the max channel difference; `svg_quality_checker` verifies generated `slice` rows have their files. ② **Trigger lean tied to `visual_style`**: each style carries a `core` / `supportive` / `sparse` illustration propensity ([`visual-styles/_index.md`](../skills/ppt-master/references/visual-styles/_index.md) `Illus.` column + each file's §6) — `core` styles recommend use by default, `sparse` default to none; precedence is `image_usage: none` → explicit user intent (overrides either way) → style propensity → none. ③ **Motif through-line**: when a deck leans into illustration, the cover anchor / section dividers / body spots are drawn from one motif family (shared h.5 rendering + palette + subject world) so the deck reads as one designed system rather than scattered spots; the AI motif generates only when `image_usage` includes `ai`, while `provided` / `web` reuse only assets that already form one family. ④ **Illustration-roles decision map**: a Strategist §h navigation table (role × when × mechanism × source — spot / hero anchor / section divider / atmospheric background / motif). Throughout: no quota, and no turning taste into a checker rule (a same-tiles placement detector was evaluated and declined, left to §4.3 placement prose + execution judgment)
|
||
|
||
- **Image transform-matrix fidelity end-to-end + host-native generation path** — `svg_to_pptx`'s DrawingML picture export now honors the SVG transform matrix (rotation / skew / compound transforms no longer shift or collapse to the origin under nested `<g transform>`), extending the cross-four-renderer position-fidelity axis to the raster layer; `image_gen.py` adds a host-native generation path that routes through the host's own image-generation capability when present. Both are fixes / incremental hardening — details in the commit log
|
||
|
||
- **Web image sourcing → best-match + reviewable + manual replace** — web rows no longer silently download a candidate pool; the default downloads **only the best match**, with the pool demoted to an opt-in `--save-candidates` escalation (default 4). Every download writes a ≤1024px review copy under `images/.review/` (placed / promoted asset stays full-resolution). Suitability review is **model-agnostic**: a multimodal model reads the review copy, a non-multimodal one hands the `source_page_url` to a human — no assumption of vision. New `image_search.py --from-url <url>` downloads any human-chosen image URL into the target (recorded `license_tier: manual`, inheriting page context) as the universal manual-replacement path; `--promote` now recomputes the credit from the chosen candidate (never the replaced image's). It all runs inside Step 5 and never halts the pipeline (a poor fit becomes `Needs-Manual` + placeholder). Web search is positioned as a placeholder-grade fallback that does **not** guarantee quality — high quality comes from AI generation or picking an image by hand and swapping it in
|
||
|
||
- **Web image entity-safety gate (exact subjects no longer lose to a "hi-res wrong image")** — building on the row above: web candidates now pass a `required_terms` entity gate that blocks metadata-relevant-but-wrong-subject images (a polished Rome monument winning a "Chongqing landmark" row). Groups are ANDed, `A|B` gives intra-group aliases (for example `Chongqing|Chungking`), and matching is lowercased / separator-normalized / space-compacted so multi-word and CJK names match; an entity hit counts as the relevance signal (a zero query-token overlap no longer rejects, so a CJK-titled landmark passes under an English query — the old reject still applies when no `required_terms` are set). Pixel area drops from a dominant score (cap 5000) to a tie-breaker (cap 1500) plus a title-hit boost, so entity accuracy and relevance outrank raw resolution. CLI `--require-terms` (repeatable, comma / `|`), batch `required_terms`, and `--from-url` all inherit it, recorded in `image_sources.json` for audit; a toothless gate (weak `required_terms`) emits a warning. It is a **metadata gate** paired with the `.review` visual check, not a visual classifier
|
||
|
||
- **Native PPTX export caps image media size** — keep generated decks editable without embedding huge source images: new native image sizing modes — `cap` (default) limits only oversized source images to a max dimension, while `display` sizes from the rendered SVG box for more aggressive compression; native export preserves full embedded pixels while SVG/PPT display cropping stays as editable picture-crop metadata; `finalize_svg` keeps its existing slice/meet behavior and adds default rendered-size downsampling for compact SVG snapshots. Docs land the `cap` / `display` modes and the `--no-image-optimize` escape hatch
|
||
|
||
### 2026-07 — Staged confirmation UI + native objects + motion hardening
|
||
|
||
- **Step 4 confirmation gate restaged into a three-pass wizard + visual previews** — the single Eight-Confirmations gate became a three-stage flow in one browser session (direction anchors → design system → images / execution), each downstream stage re-derived from the user's **actual** confirmed upstream choices instead of the AI's originals — so, e.g., the image strategy fits the confirmed color system by construction. The confirm page adds visual aids for the hard-to-name picks: a bespoke real-SVG page thumbnail for each of the 18 `visual_style` options, real icon-library samples, and AI-image reference previews. `recommendations.json` now carries a canonical `stage` selector (`tier` retained only as an internal back-compat read) and user-facing wording is unified on "stage"; the chat fallback mirrors the same staged order
|
||
|
||
- **Transitions and entrance-animation export hardened against silent downgrade** — the current defaults stay `fade` / 0.4 s for page transitions and `none` for element entrances; object motion remains opt-in through `-a` or `animations.json`. Unknown effects / Start modes, non-finite or out-of-range timing, invalid order values, and missing slide/group references now fail instead of falling back to `fade`, another Start mode, or inherited timing. Export reads the candidate PPTX back before replacement and validates root timing placement, unique time-node IDs, live shape targets, effect/duration/Start semantics, and narration timing merges. Direct-PPTX routes preserve existing object animation rather than translating it into the generated animation model. Microsoft PowerPoint is the primary behavior-validation target; other presentation apps remain compatibility targets without an identical-motion guarantee
|
||
|
||
- **`--native-objects` hardened from dormant marker to usable opt-in** — the narrow native-object exception (see Non-goals below) now emits charts and pure-text tables that keep the deck's own design instead of snapping to PowerPoint's white default theme. Classic native charts write explicit chart-area / plot-area / axis-line / gridline / label-text colors — inferred from the visible SVG fallback (largest panel `<rect>` → background, fallback text → labels, fallback strokes → axis/grid) or overridden per `style` (`chart_area_fill` / `plot_area_fill` / `text_color` / `axis_color` / `grid_color`, `"none"` for transparent); the color parser normalizes named CSS colors, `#RGB` shorthand, and `rgb()` / `rgba()` to OOXML hex; bar/column series disable negative-value fill inversion so negative bars keep their series color. The activated export is named `<name>_<ts>_native_charts.pptx` to tell it apart from the default flattened-shape export. **The default route is unchanged** — charts/tables still export as SVG-derived DrawingML shapes for cross-renderer fidelity; native objects stay the deliberate opt-in trade documented under Non-goals below
|
||
|
||
- **Native package structure + mode-specific template creation** — every new SVG page declares its final Master/Layout identity while it is authored. Fixed Master/Layout visuals are root-level atoms, reusable slots are bounded top-level groups with real carriers or an explicit composite proxy, and zero-slot Layouts remain valid. Export deterministically compiles only that contract, writes locked title/body sizes into Master `p:txStyles`, and performs final package read-back; it never promotes repeated chrome or infers placeholders. `standard` / `fidelity` author new SVG rosters and new Master/Layout systems without preserving or distilling source topology. `mirror` restores source page order, Master/Layout identities and parentage, placeholder facts, and supported visuals without semantic synthesis; fixed-layer source groups are mechanically expanded into direct atoms. Lossless imports stay in analysis and lightweight projections stay inspection-only. Library and project outputs share required `templates/`, optional `images/` / `icons/`, and optional on-demand review output in `exports/`; only library registration differs. Legacy baseline/template/preserve SVG packages first run `restore-pptx-structure`. Raw one-off PPTX filling remains `template-fill-pptx`.
|
||
|
||
- **Native-preset authoring guidance strengthened across roles** — using a real PowerPoint preset (`prstGeom`, with adjustment handles and the non-flat-card look) is reaffirmed as the default for stock geometry (block arrows, chevrons, banners, callouts, flowchart nodes, stars), not an exception. Presets are helper-generated per page (`preset_shape_svg.py`), so the guidance lives in the prompt layer, not in template exemplars: the Executor now reaches for presets inside the per-page authoring ritual — decided by object intent at draw time, never by scanning finished paths — with the accurate paint boundary spelled out (a gradient fill/stroke or pattern fill stays ordinary SVG because the helper paints `none` or a solid HEX on both fill and stroke only). The Strategist primes it upstream by appending a non-destructive `native-preset candidate` note to a §VII page's Usage, triggered by the page plan rather than a template's name; the Executor still selects the exact preset, frame, and paint. Baking preset fragments into `templates/charts/` was evaluated and rejected — a frozen frame/fingerprint invites verbatim copy, which the authoring contract forbids
|
||
|
||
---
|
||
|
||
## In progress / Next
|
||
|
||
Directions actively underway or up next, with no committed timeline.
|
||
|
||
- **Real-usage calibration of multi-deck intake and material divergence (just landed)** — multi-deck combined intake (`<stem>` prefixing + a `decks[]` merge index) and the material-divergence free-text field (under §c audience) both shipped (see "2026-06" above); next is calibration from real usage: same-stem collisions across decks currently let the later one overwrite the former — whether dedupe / numbering is needed awaits signal; and whether the Strategist reads the free-text intent accurately, and whether the "facts stay sourced" line holds when the user asks for free reshaping, awaits real generation. Neither gets a mechanical threshold added pre-emptively
|
||
- **Real-deck calibration of the illustration capability (mechanism + deployment layer, just landed)** — the slice pipeline, the edge-quality hardening, and the decision layer (style propensity / motif through-line / roles map — see "2026-06" above) have all shipped; next is calibration from real usage: whether one sheet sliced into many cells holds style / palette consistency and how robust the `--alpha` soft mask is against irregular composition inside a cell, the offline readiness-gate manual-place + re-slice experience, whether propensity flips the styles it should, whether the motif reads as a designed system rather than over-decoration on real decks, and whether the source boundary holds (no silent AI on `provided` / `web`). No mechanical threshold / quota added pre-emptively; if same-size tiles really recur, consider a narrower lint then
|
||
- **Native drop-shadow on presets — deferred as a separate enhancement** — a supported drop-shadow can technically coexist with a native preset (the effect inherits to the hidden carrier and exports as `prstGeom` + `outerShdw`), but only with exact nesting: an id'd logical group wrapping a **no-id single-child** `<g filter="url(#id)">`. The naive form (filter on the top-level id'd group) silently emits a double `outerShdw`, and `shared-standards` currently forbids a filter on a multi-element `<g>`. So presets-with-shadow is deliberately not folded into the current preset guidance — shadowed stock shapes conservatively stay ordinary SVG. Doing it right needs a precise structure spec plus a `shared-standards` / `native-shape-authoring` sweep, and possibly a checker rule to catch the double-shadow; taken up only on real signal
|
||
- Otherwise: the mode / visual-style validation and calibration is settled (see "2026-06" above) — the structure (5 modes + 18 visual-styles + custom) is locked, the four adjacent pairs are consolidated into one Close-calls table, and the four calibration tightenings have landed. Future direction is driven by real usage signal and feedback; long-running improvements are under "Ongoing maintenance" below, and evaluated-out directions under "Non-goals"
|
||
|
||
---
|
||
|
||
## Ongoing maintenance directions
|
||
|
||
Long-running improvements with no committed timeline. Only real directions are listed; specific fixes / single flags go to the commit log.
|
||
|
||
- **Prompt slimming** — compress per-role prompt token footprint and improve cache hit rate without sacrificing quality, for indirect cost / speed gains. Complements "Pure speed optimization" below: indirect optimization yes, quality-sacrificing speedups no.
|
||
|
||
---
|
||
|
||
## Non-goals
|
||
|
||
The directions below come up repeatedly and have been evaluated as **not on the path**. Listing them is not a value judgment on the underlying need — they simply don't fit this project's main route. If you specifically need these capabilities, consider other tools or forking.
|
||
|
||
### Read arbitrary PPTX templates → fill text only
|
||
|
||
**Issues**: [#53](https://github.com/hugohe3/ppt-master/issues/53), [#118](https://github.com/hugohe3/ppt-master/issues/118)
|
||
|
||
PPT Master's main route is "AI generates SVG from scratch → DrawingML", with the whole pipeline built around full control of every shape / text / layout. A structured PPTX can now become a reviewed reusable package in two explicit ways: `standard` / `fidelity` author a new SVG and Master/Layout system from visual evidence, while `mirror` restores the reachable supported source graph. Generic "open any PPTX and blindly refill every placeholder" remains a different product shape.
|
||
|
||
**The basic need is actually simple**: if you just need "replace Excel data into fixed positions in a PPT template", have the AI write a few lines of `python-pptx`. You don't need this pipeline.
|
||
|
||
> **Supported boundaries**: `template-fill-pptx` directly refills selected source slides. `create-template` either authors a new explicit SVG contract (`standard` / `fidelity`) or restores a supported source contract without semantic synthesis (`mirror`). Strict and adaptive downstream use the resulting declared contract to reconstruct native structure. What remains out of scope is unreviewed, schema-free substitution against arbitrary third-party placeholder systems.
|
||
|
||
### Switch to native PowerPoint charts (Excel-native chart)
|
||
|
||
**Issues**: [#99](https://github.com/hugohe3/ppt-master/issues/99), [#100](https://github.com/hugohe3/ppt-master/issues/100)-class
|
||
|
||
Pixel-fidelity across the four renderers (PowerPoint / Keynote / LibreOffice / WPS) is the project's spine. Switching the default route to native PowerPoint charts breaks that — the same PPTX renders different chart layouts across renderers. Charts as SVG is **by design**, not a capability gap.
|
||
|
||
The narrow exception is the `data-pptx-native` marker: supported data charts and pure text-grid tables carry native-object metadata at generation time, and exporting with `--native-objects` activates it for users who deliberately trade cross-renderer fidelity for PowerPoint-side editability on those objects — the activated objects now preserve the deck's chart-area / plot / axis / gridline / label colors and native table formatting rather than snapping to PowerPoint's default theme (see 2026-07 above). The default export path and the SVG chart/table system are unchanged.
|
||
|
||
### uv as default / required dependency
|
||
|
||
**Issue**: [#111](https://github.com/hugohe3/ppt-master/issues/111)
|
||
|
||
`pip + requirements.txt` is the only official install path because it works in every Python environment with no extra learning cost. uv is a fine tool, but making it default raises the bar for new users. If you personally prefer uv, use it in your fork — it won't affect the main line.
|
||
|
||
### Pure speed optimization
|
||
|
||
**Issue**: [#97](https://github.com/hugohe3/ppt-master/issues/97)
|
||
|
||
In the cost / speed / quality triangle this project picks **quality**. ~20 minutes for a high-quality PPTX is the current reasonable point.
|
||
|
||
Will do: indirect improvements via prompt slimming / cache hit rate.
|
||
Won't do: trading quality for "throw a few pages together" speed.
|
||
|
||
If speed-sensitive and quality-tolerant, Gamma / similar AI tools are a better fit.
|
||
|
||
### CLI / SaaS / desktop app form factors
|
||
|
||
The product form is firmly **chat-driven AI IDE skill** (Claude Code / Cursor / VS Code + Copilot / Codebuddy).
|
||
|
||
Won't do: standalone CLI (`ppm`-style), SaaS web service, Electron shell. Any "make it run independently of chat" proposal will be declined. Chat is the interaction core, not a wrapper.
|
||
|
||
---
|
||
|
||
## Feedback channels
|
||
|
||
- **Issues**: [github.com/hugohe3/ppt-master/issues](https://github.com/hugohe3/ppt-master/issues) — bugs / proposals
|
||
- **Discussions**: [github.com/hugohe3/ppt-master/discussions](https://github.com/hugohe3/ppt-master/discussions) — usage / experience sharing
|
||
- **Email**: heyug3@gmail.com
|
||
|
||
Before proposing a new direction, scan the **Non-goals** above. If your request falls there, it's unlikely to land — but we're happy to discuss other paths to your underlying need.
|