Files
wehub-resource-sync 8ef9db2513
Deploy to GitHub Pages / deploy (push) Blocked by required conditions
Deploy to GitHub Pages / build (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 12:56:49 +08:00

39 KiB
Raw Permalink Blame History

Roadmap

English | Chinese


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 PPTXsvg_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); 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) — browser preview, click elements to write annotations, say "apply my annotations" and the AI rewrites that region (built on @WodenJay's PR #85)
  • Replicate any PPTX as a template (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) — extract and reuse brand palette / typography / logo / voice
  • Visual self-review workflow (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/) — 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/) — 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 hatchrendering / 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 §1.5, 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) — 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 netsvg_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) — 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) — 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) — 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/ + 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 §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 (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) — 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 in issue #173

  • Interactive visual Strategist confirmation stage page (Step 4) (scripts/confirm_ui/server.py, field schema 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's PR #191; hyperlink preservation is distilled from @ZhaoZuohong's PR #155

  • Content-faithful PPT beautification / re-layout shipped (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) — 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 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 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 pathsvg_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, #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, #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

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

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

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.