Minor release collecting a week of fixes found by running the pipeline end to end across languages, input types, deck lengths, and a revision round on a delivered deck. Every change is backed by a reproduced defect; no route, gate, or command was added or removed.
Converter (source_to_md.py)
- PDF tables with partial ruling keep the columns drawn outside the ruled box (059119a); spreadsheet notes above the header become a quote instead of a phantom row; a scanned PDF and an out-of-order Arabic text layer are warned about (6c372a2, b3073f8).
- Web fetch keeps the declared charset under a lossy decode and warns when only a sliver of the page body was extracted (95e3c41); web tables keep their links and land on a GFM grid (17d953a, 0ae80b1); document URLs route to their converter and honour
--no-imagesand meta refresh (0b593d6, 25a9984). - DOCX charts, table footnotes, and absolute chart targets survive conversion (22da436, 4bbf7b7); PPTX read-back keeps soft line breaks (c71d9e7).
- Safety: every redirect hop is validated before it is requested, and CGNAT and multicast targets are refused (4bbf7b7).
-oon a single input names the Markdown file and says so;--jsonkeeps stdout to JSON.
Text measurement and multilingual decks
- Width calibration runs per planned script (Thai, Devanagari, Arabic, …) and at bold weight; Indic vowel signs advance the estimator; wrapping keeps words whole in every space-delimited script and breaks Korean between words (8900e87, e64a2b3, 88fb822, 0ae80b1).
- Indic, Thai, Arabic, and Japanese faces are on the PPT-safe list; Japanese decks get EA faces and kinsoku; right-to-left decks get RTL defaults; explicit BCP-47 scripts pick the theme script slot (0609875, 5771f4f).
- Latin runs inside a non-Latin deck proof as English (f76d1ec). Quick decks declare their language on the page root and the export derives theme fonts from the pages (0b06d19).
Native charts and tables
- Table parity compares runs by effective style and lets explicit run colour and weight override the cell default (451c681, aee33e5); parity reads inherited
text-anchorandtspancolour (5771f4f). series[].line_styleis rejected with a clear error and passes only inside a combo; Cambria Math is accepted; JSON CDATA survives compaction; classic axes are refused on ChartEx charts; data-label points follow their show flags (4a7512e, 83d8d00, 25a9984).- Fallback stamping reports a malformed page instead of skipping the valid ones; preset atoms keep their paint through style compaction (7acddfb, 6881d37).
Export and motion
- Morph candidates are planned and authored whether or not animation is enabled (1fb122b); exported objects are named after their SVG id (a849c49); structured decks animate slot groups and re-skin master atoms (529403b).
- MiniMax word timings that share one original-text span merge into one subtitle; written-out numbers stay whole (96742ff, 7086c45).
Quality gate
- The final gate compares the design_spec §IX roster with
svg_output/, so a page dropped or left un-planned during a revision no longer passes silently (191f462). - The carrier receipt counts pages whose §IX Relationships line names a carried relation; the unresolved-geometry warning names the
tspanrule; text picture fills count as image placements (95e3c41, ed17157).
Workflow
- A delivered project's revision has a named entry:
routing.mdsends it to a Revision Round section ingenerate-pptx.md(Default) or a revision note inquick-generate.md(Quick), covering which layer owns each kind of change, what a roster change renumbers, and which commands rerun (77c2745, 4d55172). - User-supplied images with licence terms register in
image_sources.jsonso their credits are bound at the gate; research fetches pass--no-images(8e5e30a). update_spec.pydocs state what a colour change still edits by hand and when to re-stamp fallbacks.
Preview
- Preview URLs open in the Windows browser under WSL (#287, thanks @zhuoyi780-alt).
Install
The ppt-master-skill-v6.4.0.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.